一、查询过慢原因
1.有规律速度过慢
用户访问量激增 ,解决 :mysql 集群
2.无规律速度过慢
跟表中数据量变化有关系,解决 :查询语句优化
二、判断查询语句是否需要优化依赖工具
-
慢查询记录
-
explain 执行计划
-
相关日志文件
三、MySql 查询语句中七个查询命令特征
以下根据七个查询执行优先级进行排序
- from
作用:
1.将硬盘上的表文件加载到内存中,生成一个全新的临时表
2.定位内存中已经存在的临时表
注意:
1.在一个查询语句中,第一个执行命令永远都是 from
2.from 定位的是内存中一个临时表,这个临时表必须受到指定表名
- where
作用 :
1.where 命令操作的由 from 命令生成的临时表
2.where 命令循环遍历当前临时表中每一个数据行将满足条件的数据行保存到一个全新的临时表
注意 :
1.由于 where 命令每次操作只是一个数据行,因此在 where 使用过程中是无法使用聚合函数作为判断条件
- group by
作用 :
1.首先对临时表中数据进行一次排序处理
2.然后将具有相同特征的数据行保存到同一个临时表
注意 :
1.多字段分组:首先分组字段执行顺序对于查询结果来说没有任何影响的,然后从第二个分组字段开始,操作临时表是上一个分组字段生成的临时表
2.如果 select 操作的临时表是由 group by 提供,此时 select 将遍历 group by 生成的每一张临时表在操作具体临时表时,select 只会读取指定字段中第一个数据行内容
- having
作用 :
负责将 group by 生成的临时表中不满足条件的临时表进行删除
注意:
1.having 命令不能独立出现的,只能出现在 group by 命令后面
2.having 命令每次操作的是一张临时表,因此选择判断条件来自聚合函数
- select
作用:
1.操作的临时表,由 from 或者 where 命令来提供的,select将读取制定字段中所有内容读取出来,将读取内容组成一个全新的临时表
2.操作的临时表,由group by或者 having 命令提供的。此时 select 将遍历生成的每一个临时表。在操作具体临时表时,select 只会读取指定字段的第一条数据行内容
- order by
作用 :
专门针对 select 生成的临时表中数据行进行排序,将排序后内容组成一个全新的临时表
注意 :
1.如果 order by 使用字段名进行排序时,字段名可以不出现在 seelct 生成的临时表
2.如果 order by 使用字段顺序进行排序时,索引位置必须在 select 查询语句中
- limit
作用 :
对临时表中数据行进行截取
四、查询语句特征
七个查询命令中,除了 having 命令之外。剩下的六个查询命令执行完毕后都会生成全新的临时表。
七个查询命令中,除了 from 命令外,剩下的六个查询命令操作的临时表都是上一个查询命令生成临时表。
在当前查询命令执行完毕后,mysql 自动将上一个查询命令生成的临时表进行销毁处理,所以在一个查询语句执行完毕后,用户只能看到最后一个查询命令生成的临时表。
在进行多字段分组查询时,从第二个分组字段开始,操作的临时表是上一个分组字段生成的临时表中。
五、七个查询指令中,哪些命令的执行效率过慢
1、执行效率最慢 :group by
原因 : 执行时首先将临时表中数据进行排序,然后再进行分组
2、order by
原因 : 需要对 select 生成的临时表中数据进行一次排序,然后将排好顺序的数据行组成一个全新的临时表
3、where
原因 :需要对表中所有数据进行遍历。如果临时表中数据行过多话,导致where执行效率非常慢
4、limit
原因 :如果指定起始行数过大,导致查询速度变慢
又:对于多表查询来说,没有指定表文件加载顺序,也会导致查询速度过慢