2014-10-31 36 views
0

,所以我有這個表containt 100000行MySQL的執行全表掃描,即使存在索引

field1 field2 

現在我只是增加了一個新的列字段3,而且存在於場3

field1 field2 field3 

指數所以我添加了大約50行,其中包含field3(其他行的field3爲NULL)

所以我做了一個選擇

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

對此的解釋相當理智。它使用的字段3索引和僅掃描2行

然而,正如我在陳述

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

這結束了不使用索引添加更多的價值,並最終執行整個的全表掃描100000+行。

爲什麼mysql在做這個?我知道,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

但這不可能是不是使用索引取的10個值

爲什麼mysql的這樣快,我怎麼能指示MySQL迫使他們使用索引而不是執行全表掃描...

+1

哪個存儲引擎(InnoDB,MyISAM還是?)。很可能,MySQL對索引基數的估計與您預期的不同。統計數據由MyISAM和InnoDB處理。 [** myisam-index-statistics **](http://dev.mysql.com/doc/refman/5.5/en/myisam-index-statistics.html)[** innodb-statistics-estimate.html ** ](http://dev.mysql.com/doc/refman/5.5/en/innodb-statistics-estimation.html)優化器可以受**語句中包含的**提示** ** **索引提示** ](http://dev.mysql.com/doc/refman/5.5/en/index-hints.html)。 – spencer7593 2014-10-31 18:58:28

+0

我正在使用InnoDB – pillarOfLight 2014-10-31 19:07:35

回答

1

問:爲什麼MySQL這樣做?

答:可能MySQL對索引的基數的估計值與您預期的不同,MySQL估計全表掃描是比使用索引更有效的計劃。有許多方法可以影響統計數據,包括MyISAM和InnoDB。參考:http://dev.mysql.com/doc/refman/5.5/en/myisam-index-statistics.html

問:我該如何指示MySQL強制他們使用索引?

- 答:你可以嘗試影響統計數據的收集,所以MySQL提出了不同的基數。

或者你可以嘗試,包括在查詢文本索引提示:

SELECT * FROM mytable FORCE INDEX myindex WHERE ... 

或者,你可以嘗試重新編寫查詢作爲多個選擇與UNION合併ALL集合運算符:

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