2013-12-16 2 views
1

은 다음과 같이 테이블을 만듭니다쿼리 최적화

CREATE TABLE test (a INT(10), b char(10)); 

두 개의 인덱스를 추가 :

alter table test add key aa (a), add key bb (b); 

가 일부 행 삽입 :

insert into test values (132,'logi'); 
insert into test values (322,'koko'); 
insert into test values (32,'kola'); 

등 ...

적은 수의 행으로 테스트 할 수 있습니다. 는 그래서, 나는 두 개의 쿼리를 실행하려는 가정 해 봅시다 :

1) explain select * from test where b like "frif%"; 
2) explain select * from test where a like "32%"; 

첫 번째를 B부터 BB 인덱스를 사용하지만 내 응용 프로그램에서 나는 그래서 내가 물어려고하는 것은 의미가 만드는 행 억이있을 것이다 는 char이며, 두 번째는 aa를 사용하지 않는 반면, a는 int 일 뿐이며 char처럼 취급합니다. 어떻게 두 번째 쿼리를 첫 번째로 실행하고 "some_number %"와 같은 숫자를 검색하여 ALL이 아닌 범위 유형의 쿼리로 만들 수 있습니까 (설명대로).

+1

INT가의 문자열로 변환 작동 안함. –

+1

아마도 A에 대한 함수 기반 인덱스가 문자 데이터로 캐스팅되었습니다. 이로써 엔진이 사용할 인덱스가 생성됩니다. – xQbert

+0

xQbert, 나는 CAST 함수로 제안한 것을하려고했지만 다음과 같은 것을 시도했다. (설명) select * from test where "32 %"와 같은 캐스트 (a CHAR); 작동하지 않습니다! –

답변

1

숫자를 문자열로 취급하는 경우 그 방법으로 저장하십시오. 숫자가 어떤 종류의 코드 인 것처럼 들립니다. 숫자로 구성되어 있지만 실제 계정 이름과 같은 것입니다. 숫자가 고정 길이 인 경우

, 당신이 할 수있는, 5 말 :

where a >= 32000 and a < 33000; 

당신은 서로 다른 길이의이 아이디어를 확장 할 수 : 인덱스가 왜

where a >= 32 and a < 33 or 
     a >= 320 and a < 330 or 
     a >= 3200 and a < 3300 or 
     a >= 30000 and a < 33000 
+0

감사합니다. 또한 이것이 해결책이라고 생각하지만 내 응용 프로그램의 필드 'a'(INT)가 큰 INT이고 12 자리 숫자가 포함되어 있기 때문에 문제에 적용 할 수 없습니다. VARCHAR, 스토리지 오버 헤드가 생길 것입니다. –

+0

@JohnZobolas. . . 왜 이것이 당신의 상황에 적용될 수 없습니까? 'a> = 3000000000000 및 <3300000000000' 또는 무엇이든간에 '그냥'이라고했을 것입니다. –

+0

물론 적용 할 수 있습니다 :하지만 저장소 오버 헤드가 의미하는이 있습니다 : 나는 저장하는 데 8 바이트 소요되는 숫자 num : BIGINT 있습니다. VARCHAR로 테이블 정의에서 선언하면 모든 자릿수에 1 바이트가 필요합니다 (이 경우 digit = char). 따라서 8 자리 이상 (많은 숫자가 있음)에는 8 바이트 이상이 필요합니다 (예 : 숫자가 14자인 VARCHAR, 14 바이트의 저장 공간이 필요함). –