mysql查询中利用索引的机制
浏览:4985次 出处信息
今天遇到一个奇怪的问题,明明已经建立了索引,select语句的explain也表明会利用这个索引,可是结果偏偏没有用索引,最后扫描了全表。
两个结构完全一样的sql语句:
sql1: select * from table where col_a = 123 and col_b in (‘foo’,\'bar’) order by id desc;
sql2: select * from table where col_a = 456 and col_b in (‘foo’,\'bar’) order by id desc;
结果sql1选择利用了col_a的索引,速度很快,sql2利用了主键ID的索引,扫描了全表(40w行)。
仔细分析,发现数据库中,col_a=456的记录数有近1万条,而col_a=123的记录数只有几条。
于是就清楚了,mysql选择索引不仅仅依据查询结构和索引结构,还会根据索引大概估算选择每种索引的数据量,然后选择他认为最快的索引。
可能是主键索引会比普通index更快,所以mysql最后选择了数据量跟大的id索引。
那么,如何解决这个问题呢?
很简单,只要在order语句里写多个键即可,比如:order by col_a, id desc
建议继续学习:
- 由浅入深探究mysql索引结构原理、性能分析与优化 (阅读:15305)
- 浅谈MySQL索引背后的数据结构及算法 (阅读:10092)
- 由浅入深理解索引的实现(2) (阅读:6590)
- HBase二级索引与Join (阅读:5940)
- 如何建立合适的索引? (阅读:5583)
- InnODB和MyISAM索引统计集合 (阅读:5403)
- Innodb 表和索引结构 (阅读:4938)
- MySQL索引背后的数据结构及算法原理 (阅读:4562)
- 多维度分类排行榜应用:用位图索引 (阅读:4106)
- mysql索引浅析 (阅读:4217)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:使用内置定时事件的功能来定时删除 binlog
后一篇:主从同步失败,报错 1594 >>
文章信息
- 作者:shen2 来源: 沈二铺子
- 标签: 索引
- 发布时间:2012-03-04 20:40:44
建议继续学习
近3天十大热文
-
[69] find命令的一点注意事项
-
[53] 读书笔记-壹百度:百度十年千倍的29条法则
-
[38] 小屏幕移动设备网页设计注意事项
-
[37] memory prefetch浅析
-
[36] 卡诺模型―设计品质与设计价值的思考
-
[31] Oracle bbed工具的编译
-
[23] 杨建:网站加速--Cache为王篇
-
[21] 程序员技术练级攻略
-
[21] 在vim保存时获得sudo权限
-
[20] 洋葱式信息安全观察:信息安全与业务浪涌