首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使索引存在,mysql仍会执行全表扫描。

即使索引存在,mysql仍会执行全表扫描。
EN

Stack Overflow用户
提问于 2014-10-31 18:42:26
回答 1查看 2.9K关注 0票数 2

所以我有一个包含100000行的表

代码语言:javascript
复制
field1 field2 

现在,我刚刚添加了一个新列field3,而且field3上还有一个索引

代码语言:javascript
复制
field1 field2 field3

因此,我添加了大约50个包含field3的行(其他行的field3为NULL)

所以我选择了

代码语言:javascript
复制
SELECT * FROM table WHERE field3 IN (val1, val2);

对此作出解释是相当明智的。它在field3上使用索引,只扫描2行

但是,当我在in语句中添加更多值时

代码语言:javascript
复制
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强制他们使用索引而不是执行全表扫描.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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提出了一个不同的基数。

也可以尝试在查询文本中包含索引提示:

代码语言:javascript
复制
SELECT * FROM mytable FORCE INDEX myindex WHERE ...

或者,您可以尝试将查询重写为多个SELECT与UNION操作符相结合:

代码语言:javascript
复制
SELECT * FROM mytable WHERE field3 = val1
 UNION ALL
SELECT * FROM mytable WHERE field3 = val2
 UNION ALL
SELECT * FROM mytable WHERE field3 = val3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26681404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档