【发布时间】:2014-10-31 18:42:26
【问题描述】:
所以我有这个表包含 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 强制他们使用索引而不是执行全表扫描...
【问题讨论】:
-
哪个存储引擎(InnoDB、MyISAM 或?)。很可能,MySQL 对索引基数的估计与您的预期不同。 MyISAM 和 InnoDB 对统计数据的处理方式不同。 myisam-index-statistics innodb-statistics-estimation.html 优化器可能会受到语句index-hints 中包含的提示 的影响。
标签: mysql performance indexing full-table-scan