
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在前几期的文章中给大家简单介绍了关于数据库索引的一些基础知识等内容,而本文我们就再来学习一下,高性能索引策略实践。
讨论话题前的思考:有索引一定会走索引吗?
有索引不一定会走索引,因为mysql会根据查询优化器,对表中的数据量多少,筛选匹配后的数据量多少,全表扫描,使用各个索引的成本,回表的记录数多少等等进行成本分析,以此来选择优的方式来执行sql。
正确地创建和使用索引是实现高性能查询的基础,下面我们来看看如何创建高性能的索引:
1.选择区分度高的字段建立索引
索引字段的区分度/离散度越高,则检索的次数越少。如果字段的区分度不高,可能整个查询下来会查询超过一半多的数据,同时这样索引页内部的用户分组没法快速筛选数据,这样也就没法快速利用二分查找的算法。此外区分度高的索引可以利用好二分查找算法,检索性能更高,在检索数据时过滤掉更多的数据,减少回表的次数。
那么如何判断表内某些字段的离散度高不高呢?我们可以通过数据库表字段不重复的个数除于所有行数来计算,值越大说明离散度越高。
SELECTCOUNT(DISTINCT字段)/COUNT(*)from表;
2.在允许的情况下,尽量选择占用存储空间少的字段建立索引
数据类型越小,在查询时进行的比较操作越快(CPU层次)
数据类型越小,索引占用的存储空间就越少,在一个数据页内就可以放下更多的记录,从而减少磁盘I/0带来的性能损耗,也就意味着可以把更多的数据页缓存在内存中,从而加快读写效率。
3.where语句中经常被使用到的字段应该建立索引,分组字段或排序字段应创建索引,多表连接字段应该创建索引
只为出现在where子句中的列、连接子句中的连接列创建索引,而出现在查询列表中的列一般就没必要建立索引了,除非是需要使用覆盖索引。又或者为出现在orderby或groupby子句中的列创建索引。
4.更新频繁的字段不适合建立索引
如果这个字段更新很频繁,那么需要经常去维护这个字段建立的相关索引,坏的结果可能会导致页分裂,合并等,性能开销很大。
5.建立索引遵循左前缀原则
遵循左前缀原则,能够让查询条件尽大可能的命中更多的索引列,大化的命中更多索引列。
6.尽量使用前缀索引
有时候我们需要对一些字符串很大的字段建立索引,这会让索引变的很大,内存的开销很大,cpu操作大的数据也很慢且一个数据页存储的字段数据更少,查询更慢。我们可以将字段的开始的部分字符建立索引,这样大大减少了内存开销,也提高了索引的效率。选择使用前缀索引的同时,也失去了字段的区分度。因此我们要保证前缀索引有足够高的区分度,同时也不能保证索引太大。
我们可以通过计算,来找到合适建立的前缀长度。通过如下sql不断的调整前缀长度的大小,来查看离散度的大小的增幅变化,从而来找到适合的前缀长度大小。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。