2014-10-31 2 views
0

그래서 난 그냥 새로운 열 FIELD3을 추가하고 또한 FIELD3MySQL은 전체 테이블 인덱스가

field1 field2 field3 

에 인덱스가이 테이블이 (가) 포함에게 100000 행

지금
field1 field2 

이있는 경우에도 검사 수행 그래서 나는 field3을 포함하는 약 50 개의 행을 추가했다. (다른 행은 field3를 NULL로 갖는다.)

그래서 내가 선택한다

SELECT * FROM table WHERE field3 IN (val1, val2); 

설명이 상당히 정상적입니다. 그것은 FIELD3에 인덱스를 사용하고, 단지 내가 IN 문

SELECT * FROM table WHERE field3 IN (val1, val2, val3, val4, val5, val6, val7, val8, val9, val10); 

이 인덱스를 사용하지 끝에서 더 많은 값을 추가하지만 같은 2 행

를 검색하고 전체의 전체 테이블 스캔을 수행하는 끝 100000 개 이상의 행이 있습니다.

왜 이렇게합니까? 나는 MySQL의 "If you need to access most of the rows, it is faster to read sequentially, because this minimizes disk seeks."http://dev.mysql.com/doc/refman/5.1/en/mysql-indexes.html

에서 것은 그러나 이것은 아마도

이유는 MySQL이이 일을한다 그 (10)의 값을 가져 오기 위해 인덱스를 사용하는 것보다 더 빠르게 할 수 없음을 알고 난 mysql을 지시 할 수있는 방법 인덱스를 사용하도록 강제로 전체 테이블 스캔을 수행하는 대신 ...

+1

: 당신은 UNION과 함께 ALL 집합 연산자를 결합하여 재 작성 쿼리를 여러 건의 SELECT를 시도 할 수,

SELECT * FROM mytable FORCE INDEX myindex WHERE ... 

또는 어떤 스토리지 엔진 (InnoDB, MyISAM 또는?). MySQL의 인덱스 카디널리티 추정치가 예상했던 것과 다를 가능성이 있습니다. 통계는 MyISAM과 InnoDB에 의해 다르게 처리됩니다. [** myisam-index-statistics **] (http://dev.mysql.com/doc/refman/5.5/en/myisam-index-statistics.html) [** innodb-statistics-estim.html ** ] (http://dev.mysql.com/doc/refman/5.5/en/innodb-statistics-estimation.html) Optimizer는 [** index-hints **] 문에 포함 된 ** 힌트 **에 영향을받을 수 있습니다. ] (http://dev.mysql.com/doc/refman/5.5/en/index-hints.html). – spencer7593

+0

InnoDB를 사용하고 있습니다. – pillarOfLight

답변

1

Q : 왜 MySQL이 이것을합니까?

A : 아마도 인덱스의 카디널리티 추정치는 예상 한 것과 다르며 MySQL은 전체 테이블 스캔이 인덱스를 사용하는 것보다 더 효율적인 계획이라고 추정합니다. MyISAM과 InnoDB 모두 통계에 영향을 미치는 방법이 있습니다. 참조 : http://dev.mysql.com/doc/refman/5.5/en/myisam-index-statistics.html

Q : 어떻게 인덱스를 사용하도록 MySQL에 지시 할 수 있습니까?

A : 통계 수집에 영향을 미칠 수 있으므로 MySQL은 다른 카디널리티를 제공합니다.

아니면 쿼리 텍스트 인덱스 힌트를 포함하여 시도 할 수 있습니다 :

SELECT * FROM mytable WHERE field3 = val1 
UNION ALL 
SELECT * FROM mytable WHERE field3 = val2 
UNION ALL 
SELECT * FROM mytable WHERE field3 = val3