2011-03-25 2 views
0

일부 숫자 열을 포함하는 테이블을 가지고 있으며 대부분의 시간에 그 값을 얻을 수 있기 때문에 숫자를 유지해야합니다. 여기서 문 전숫자 기반의 함수 기반 인덱스

...where num_col1 like "1234%... 

내 질문 같은 것을해야합니다 내에서 수 있도록하지만 난이 부분 일치를 사용하는 컬럼에 대한 일반적인 검색을하는 것도 필요한 것은 :

내가 num_col1 캐스팅에 함수 인덱스를 만들 수 있습니다 CHAR에 대한 열? 나는 시도했다. 그러나 그것은 불가능한 것처럼 보인다.

아니요, 내 쿼리의 결과 속도를 높이려면 다른 제안이 있습니까?

내가 읽을 수있는 몇 가지 해결책은 원래 테이블의 뷰를 만들 수 있고 거기에 varchar로 열 유형을 변경하고 해당 열 또는 다른 솔루션이 내 테이블 및 색인에 추가 varchar 열을 추가 할 수 있습니다 그. 나는 이미 거대한 양의 행과 엄청난 양의 컬럼을 포함하고있는 정말 큰 테이블을 가지고 있기 때문에이 두 가지 솔루션을 피하고 싶다. 모두에게 사전에

감사합니다, 보다도, N.

답변

1

내가보기를 사용하려면 당신의 본능은 데이터 중복을 막기 위해, 올바른 생각합니다. 그러나 한 경우에는 숫자로, 다른 한 경우에는 문자열 검색으로 최적화 된 요구 사항은 무엇입니까? 이에 따라 번호 매기기 시스템을 살펴보면 문자열 비교보다 훨씬 빠른 숫자 범위 (x> = 12340 및 x < 12350)를 검색 할 수 있는지 확인할 수 있습니다.

+0

원본 테이블에 많은 데이터를 업데이트하고 자주 삽입하기 때문에보기가 가볍습니다. 그리고 하나의 범위에서 검색 할 수 있기 때문에 12345678이 포함 된 열이 있다고 말하면 사용자가 "1234"를 검색하면이 열이 내 쿼리 결과에 포함되기를 원합니다. – kefer9

+0

속도를 높이려면이 작업을 수행 할 것입니다. 먼저 최대 ID를 가져 와서 크기가 자릿수인지 확인하십시오. 그런 다음 SQL 생성 객체/스크립트에서 각 범위를 최대 자릿수까지 검색하는 WHERE 구문을 생성하십시오. 따라서 최대 ID가 999999이고 사용자가 "1234"를 입력하면 WHERE 절은 다음과 같이 생성됩니다. "WHERE (id> = 1234 AND id <1235) 또는 (id> = 12340 AND id <12350) OR (id> = 123400 AND id <123500) ". 약간의 논리가 필요 하겠지만,보기가 불가능하고 성능이 중요하다면 DB에서 쉽게 될 것입니다. – roberttdev

+0

@robert - 나쁘지는 않지만 - 조금 부 풀어 보이지만 아마 문제를 해결할 것입니다. 검색 대상에 대한 실제 요구 사항은 아직 명확하지 않습니다. 항상 시작 4 자리입니까? '지능형'키는 항상 문제입니다. 따라서 원래 테이블 디자인으로 돌아가서 처음부터 그 부분을 나눌 것을 제안합니다. – Randy

2

MySQL에는 기능 기반 인덱스, 가상 열 또는 인덱싱 된 뷰 (afaik)가 없습니다.

SQL Indexing Tutorial에서 메모 on function based indexes in MySQL을 인용 :

백업 솔루션은 식의 결과를 보유하고있는 테이블에서 실제 열을 만드는 것입니다. 트리거는 또는 응용 프로그램 계층에서 열을 유지 관리해야합니다. 더 적절해야합니다. 새 열은 다른 열과 마찬가지로 인덱싱 할 수 있으며 SQL 문은 식없이 새 열을 쿼리해야합니다.

그러나 특별한 경우에는 LIKE 식 '% 1234 %'을 (를) 사용하여 필터링 할 수 있습니다. 이 경우 b 트리는 도움이되지 않습니다 (LIKE performance tuning/indexing에서 설명). MyISAM에서만 작동하는 전체 텍스트 인덱싱이 필요합니다.

+0

나는 그 인용문을 읽었는데, 필자가 피하고 싶었던 것은 기본적으로 원본을 복제하는 컬럼을 추가하는 것인데, 단지 다른 타입을 가지고있다. 따라서 텍스트 열만있는 미러 테이블을 만드는 것이 더 합리적입니다. 게시물의 마지막 부분에 응답하면 '% 1234 %'의 상황에 직면하지 않습니다. 나는 단지 '1234 %'만 가지고 있으므로 그 경우 색인이 작동합니다. – kefer9

+1

@ Kaiser 함수 기반 색인이 필요한 기능입니다. 여전히 데이터를 복제하지만 인덱스에만 적용됩니다. MySQL에는 그 기능이 없으므로 백업 솔루션을 사용해야합니다 (기능 기반 인덱싱을 지원하는 광고 DB를 사용할 수 없다고 가정). 백업 솔루션은 해당 데이터를 테이블 및 인덱스에 복제합니다. 그리고 WHERE 절에서 다른 열을 쿼리해야하는 이상한 점이 있습니다. 그것은 일반적인 백업 솔루션입니다 ... –

+0

그건 내가 하하를 듣고 싶지 않았어 :) 아마 백업 솔루션에 갈 것이다;) 감사합니다 마르쿠스. – kefer9