mysql 索引优化的要点(系列一)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 索引优化的要点(系列一)相关的知识,希望对你有一定的参考价值。

背景:sql 优化对数据来说是什么非常重要,sql的索引优化更重中之重,有的人认为索引优化就是简单加一个索引,其实这种想法是错的,索引是涉及到很多知识点,并非大家想得这么简单,废话不多说,马上开车!

一,头盘:

SQL语句的五大要素:
1,获得结果集所需访问的查询条件
2,定义结果集所需的查询条件
3,结果集的大小
4,获得结果集所涉及的表的数量
5,多少用户同时修改这些数据

二,主菜:索引的一些特性和优化建议

1,经常变的索引列放在最后,这样会降低变更成本
2,索引字段的顺序非常重要,如果排序前有范围查询就不能使用索引排序,如:
索引A(a,b.c)
select a,b,c from t where a=1 and b between d1 and d2 order by c;
这样就需要排序
索引B(a,c,b)
就不用排序

--备注:
一般来说会优先选择B不需要排序,因为一般来说一个事务每次查询的结果集都是很小的,会限定输出的结果集,这个时候不用排序就会很快,选择索引A时结果集要排序,如果结果集(满足条件的结果)很大的话,这样是会很慢的

3,当以下三个条件同时满足,过虑因子隐患可以会产生:
1),访问路径中没有排序
2),第一屏幕结果一建立就回应
3),不是所有的谓词字段都参与定义待扫描的索引片

4,使用短索引。如果对多列进行索引,应该指定一个前缀长度,只要有可能就应该这样做。
例如,如果有一个CHAR(200) 列,如果在前10 个或20 个字符内,多数值是惟一的,
那么就不要对整个列进行索引。对前10 个或20 个字符进行索引能够节省大量索引空
间,也可能会使查询更快。较小的索引涉及的磁盘I/O 较少,较短的值比较起来更快。
更为重要的是,对于较短的键值,索引高速缓存中的块能容纳更多的键值,因此,mysql
也可以在内存中容纳更多的值。这增加了找到行而不用读取索引中较多块的可能性。
(当然,应该利用一些常识。如仅用列值的第一个字符进行索引是不可能有多大好处的,因为这个索引中不会有许多不同的值)

5,物化结果集:是指执行必要的数据库访问来构建结果集(比如排序)
1)为了避免不必要的工作,数据库系统总是尽可能晚地去进行物化结果,如果数据库系统先物化结果集,那么在FETCH调用的时候,系统将从临时表中检索记录,而在数据更新的时候,并不会更新临时表中存放的结果集
2)一次FETCH调用物化一条记录
如果满足的条件:
(1)没有排序需求
(2)存在一个可以满足结果集的索引
3)提前物化
(1)一般来说有排序都要提前物化,结果集排序,就是只需要提取一条记录,也必须物化整个结果集

6,过滤因子隐患
过滤因子:被用来定义谓词的选择性:满足谓词条件的记录数占表行总数的比例,该值取决于列值的分布情况,当评估一个索引是否合适时,最差的情况的过滤因子比平时的过滤因子更重要

半宽索引:一个包含where子句中所有列是的索引,使用半宽索引时,只有检索到匹配条件时才会访问表,而这个访问是随机读
宽索引:一个包含了select 语句中所涉及的所有字段的索引,包括投影的字段和where子句中的字段,使用这种索引时,不需要读表
结论:宽索引的优势在于避免了返回的结果集的回表随时读

三,下车收工
下次和大家分享三星索引

以上是关于mysql 索引优化的要点(系列一)的主要内容,如果未能解决你的问题,请参考以下文章

Mysql优化系列之索引性能

MySQL优化概述

#yyds干货盘点#MySQL索引优化系列:索引全用及最左法则

MySQL索引优化系列:索引失效

MySQL优化系列2-索引原理和优化

Mysql系列—— 索引下推优化