IT技术博客大学习 共学习 共进步

mysql查询中利用索引的机制

沈二铺子 2012-03-04 20:40:44 浏览 6,583 次

    今天遇到一个奇怪的问题,明明已经建立了索引,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

建议继续学习

  1. 由浅入深探究mysql索引结构原理、性能分析与优化 (阅读 16,123)
  2. 浅谈MySQL索引背后的数据结构及算法 (阅读 11,384)
  3. 由浅入深理解索引的实现(2) (阅读 7,524)
  4. HBase二级索引与Join (阅读 6,862)
  5. 如何建立合适的索引? (阅读 6,663)
  6. InnODB和MyISAM索引统计集合 (阅读 6,084)
  7. Innodb 表和索引结构 (阅读 6,041)
  8. MySQL索引背后的数据结构及算法原理 (阅读 5,622)
  9. mysql索引浅析 (阅读 5,181)
  10. Fastbit中的bitmap索引算法 (阅读 5,144)