MySQL的索引优化分析

一、性能下降SQL慢,执行时间长,等待时间长

1.查询语句写的烂

2.索引失效

3.关联查询太多join(设计缺陷或不得已的需求)

4.服务器调优及各个参数设置(缓冲、线程数等)

二、常见通用的join查询

sql执行顺序

手写

MySQL的索引优化分析_字段

机读

MySQL的索引优化分析_数据库_02

总结

MySQL的索引优化分析_数据_03

三、索引简介

1.是什么

MySQL的索引优化分析_sql_04
MySQL的索引优化分析_数据库_05
MySQL的索引优化分析_数据_06
MySQL的索引优化分析_mysql_07
MySQL的索引优化分析_数据库_08

2.优势

MySQL的索引优化分析_数据_09

3.劣势

MySQL的索引优化分析_数据_10

4.mysql索引分类

MySQL的索引优化分析_数据_11
MySQL的索引优化分析_mysql_12

5.mysql索引结构

MySQL的索引优化分析_字段_13
检索原理
MySQL的索引优化分析_数据库_14
MySQL的索引优化分析_sql_15

6.哪些情况下需要创建索引

MySQL的索引优化分析_数据库_16

7.哪些情况不要创建索引

MySQL的索引优化分析_sql_17
MySQL的索引优化分析_mysql_18

四、性能分析

1.MySql Query Optimizer

MySQL的索引优化分析_字段_19

2.MySql常见瓶颈

MySQL的索引优化分析_sql_20

3.Explain

是什么(查看执行计划)

MySQL的索引优化分析_mysql_21

能干嘛

MySQL的索引优化分析_数据_22

怎么玩

MySQL的索引优化分析_mysql_23

各字段解释

id

MySQL的索引优化分析_数据库_24
三种情况
id相同,执行顺序由上至下
id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
id相同不同,同时存在

select_type

有哪些
MySQL的索引优化分析_字段_25
查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询
MySQL的索引优化分析_数据_26

table

显示这一行的数据是关于哪张表的

type

MySQL的索引优化分析_数据_27
访问类型排列
MySQL的索引优化分析_mysql_28
MySQL的索引优化分析_mysql_29
MySQL的索引优化分析_sql_30

possible_key

MySQL的索引优化分析_数据库_31

key

MySQL的索引优化分析_数据库_32

key_len

MySQL的索引优化分析_mysql_33

ref

MySQL的索引优化分析_字段_34

rows

MySQL的索引优化分析_mysql_35

Extra

包含不适合在其他列中显示但十分重要的额外信息
MySQL的索引优化分析_数据库_36

五、索引失效(应该避免)

1.各种情况

MySQL的索引优化分析_mysql_37

六、查询截取分析

1.查询优化

永远小表驱动大表,类似嵌套循环Nested loop

MySQL的索引优化分析_数据_38
MySQL的索引优化分析_数据_39

order by关键字优化

order by 子句,尽量使用Index方式排序,避免使用FileSort方式排序

MySQL的索引优化分析_字段_40

尽可能在索引列上完成排序操作,遵照索引键的最佳左前缀
如果不在索引列上,filesort有两种算法,mysql就要启动双路排序和单路排序

双路排序
Mysql4.1之前是使用双路排序,字面意思就是两次扫描磁盘,最终得到数据,读取行指针和orderby列,对他们进行排序,然后扫描已经排序好的列表,按照列表中的值重新从列表中读取对应的数据输出

从磁盘中取排序字段,在buffer进行排序,再从磁盘取其他字段
取一批数据,要对磁盘进行两次扫描,众所周知,I\O是很耗时的,所以在mysql4.1之后,出现了第二种改进的算法,就是单路排序
单路排序
从磁盘读取查询需要的所有列,按照order by列在buffer对它们进行排序,然后扫描排序后列表进行输出,它的效率更快一些,避免了第二次读取数据。并且把随机IO变成了顺序IO,但是它会使用更多的空间,因为它把每一行都保存在内存中了。
结论及引申出的问题
由于单路是后出的,总体而言好过双路
但是单路有问题
MySQL的索引优化分析_sql_41

优化策略

增大sort_buffer_size参数的设置
增大max_length_for_sort_data参数的设置
MySQL的索引优化分析_数据库_42

小总结

MySQL的索引优化分析_sql_43

group by关键字优化

MySQL的索引优化分析_数据_44

2.慢查询日志

是什么

MySQL的索引优化分析_数据库_45

怎么玩

说明

MySQL的索引优化分析_sql_46

查看是否开启及如何开启

MySQL的索引优化分析_数据_47
MySQL的索引优化分析_字段_48
MySQL的索引优化分析_字段_49
MySQL的索引优化分析_sql_50

那么开启了慢查询日志后,什么样的sql才会记录到慢查询日志里面呢?

MySQL的索引优化分析_sql_51

case

查看当前多少秒算慢

MySQL的索引优化分析_字段_52

设置慢的阈值时间

MySQL的索引优化分析_数据库_53

为什么设置后看不出变化?

MySQL的索引优化分析_数据_54

日志分析工具mysqldumpslow

MySQL的索引优化分析_数据库_55

查看mysqldumpslow的帮助信息

MySQL的索引优化分析_sql_56
MySQL的索引优化分析_数据_57

3.批量数据脚本

MySQL的索引优化分析_数据_58
MySQL的索引优化分析_字段_59

4.show profile

MySQL的索引优化分析_字段_60

分析步骤

是否支持,看看当前的mysql版本是否支持

MySQL的索引优化分析_sql_61

开启功能,默认是关闭,使用前需要开启

MySQL的索引优化分析_数据库_62

运行sql
查看结果,show profiles
诊断sql,show profile cpu,block io for query 上一步前面的问题sql数字号码

参数备注
MySQL的索引优化分析_字段_63

日常开发需要注意的结论

MySQL的索引优化分析_sql_64

5.全局查询日志

配置启用

MySQL的索引优化分析_sql_65

编码启用

MySQL的索引优化分析_数据_66

永远不要在生产环境开启这个功能