关于mysql 索引自动优化机制: 索引选择性(Cardinality:索引基数)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了关于mysql 索引自动优化机制: 索引选择性(Cardinality:索引基数),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2002字,纯文字阅读大概需要3分钟。
内容图文
1、两个同样结构的语句一个没有用到索引的问题:
其实当本身的查询就约等于一个全表查询的时候,强不强制使用索引基本上没什么效果。
2、再看个例子:
今天遇到一个奇怪的问题,明明已经建立了索引,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
REF:mysql查询中利用索引的机制 http://blogread.cn/it/article/5023?f=wb
3、本质原因:Cardinality(索引基数)
很关键的一个参数,平均数值组=索引基数/表总数据行,平均数值组越接近1就越有可能利用索引。
索引选择性是不重复的索引值也叫基数(cardinality)表中数据行数的比值,索引选择性=基数/数据行,基数可以通过“show index from 表名”查看。
高索引选择性的好处就是mysql查找匹配的时候可以过滤更多的行,唯一索引的选择性最佳,值为1。
4、关于 mysql 索引优化与使用请见:
由浅入深探究mysql索引结构原理、性能分析与优化
原文:http://www.cnblogs.com/qqxiongmao/p/6004978.html
内容总结
以上是互联网集市为您收集整理的关于mysql 索引自动优化机制: 索引选择性(Cardinality:索引基数)全部内容,希望文章能够帮你解决关于mysql 索引自动优化机制: 索引选择性(Cardinality:索引基数)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。