所以我有一个包含100000行的表
field1 field2 现在,我刚刚添加了一个新列field3,而且field3上还有一个索引
field1 field2 field3因此,我添加了大约50个包含field3的行(其他行的field3为NULL)
所以我选择了
SELECT * FROM table WHERE field3 IN (val1, val2);对此作出解释是相当明智的。它在field3上使用索引,只扫描2行
但是,当我在in语句中添加更多值时
SELECT * FROM table WHERE field3 IN (val1, val2, val3, val4, val5, val6, val7, val8, val9, val10);这最终导致不使用索引,并最终对整个100000+行执行完整的表扫描。
mysql为什么要这样做?我知道来自http://dev.mysql.com/doc/refman/5.1/en/mysql-indexes.html的mysql "If you need to access most of the rows, it is faster to read sequentially, because this minimizes disk seeks."
但这不可能比使用索引获取这10个值更快
为什么mysql要这样做,我如何指示mysql强制他们使用索引而不是执行全表扫描.
发布于 2014-10-31 19:16:18
Q:,MySQL为什么要这么做?
A:可能是MySQL对索引基数的估计与您预期的不同,而MySQL估计完整的表扫描比使用索引更有效。有一些方法可以影响统计,包括MyISAM和InnoDB。参考资料:http://dev.mysql.com/doc/refman/5.5/en/myisam-index-statistics.html
Q:如何指示MySQL强制他们使用索引?
A:,您可以尝试影响统计数据的收集,因此MySQL提出了一个不同的基数。
也可以尝试在查询文本中包含索引提示:
SELECT * FROM mytable FORCE INDEX myindex WHERE ...或者,您可以尝试将查询重写为多个SELECT与UNION操作符相结合:
SELECT * FROM mytable WHERE field3 = val1
UNION ALL
SELECT * FROM mytable WHERE field3 = val2
UNION ALL
SELECT * FROM mytable WHERE field3 = val3https://stackoverflow.com/questions/26681404
复制相似问题