数据准备

1, 慢查询

在MySQL中提供了一种以供我们记录耗时SQL运行时间的日志文件, 即慢查询日志, 用以帮助我们在使用MySQL的的过程中快速定位和排查耗时SQL, 进而优化SQL语句提供了方便.

在慢查询日志中我们可以设置指定的SQL执行上限时间, 用以记录耗时SQL的执行过程.

1.1 设置

默认设置

慢查询日志的位置: 慢查询日志默认处于未开启状态

慢查询SQL的时间阈值: 默认阈值为10S

修改配置

开启慢查询文件

更改耗时SQL阈值

修改回默认设置 (测试完成之后, 改回来)

1.2 使用

执行SQL

执行一个运行时间较长的SQL

观察日志

观察日志: 示例

日志的内容:

2, explain

在 MySQL 中 EXPLAIN 的存在具有重要的意义。

EXPLAIN 提供了查询执行计划的大致执行信息,包括 MySQL 如何读取表、选择索引、连接表以及过滤数据等,从而使用户能够进一步了解查询的执行过程。通过 EXPLAIN 输出,用户可以识别查询中的性能瓶颈,例如全表扫描、索引未被使用、使用临时表或文件排序等,并采取相应的优化措施,如添加或修改索引、重写查询、调整表结构等。EXPLAIN 还帮助用户在优化查询之后验证优化效果,通过对比优化前后的执行计划确认优化措施是否有效。它是诊断和排查数据库性能问题的重要工具,帮助用户识别导致性能下降的原因并解决问题。

简而言之: explain以一种可视化的形式, 帮我们近似展示SQL底层执行的状态/执行计划

而我们使用EXPLAIN 只需要在待查询语句前面加上explain关键字,就可以了.

2.1 explain和各个结果字段

2.1.1 id

id标识符。这是查询中的SELECT的序列号. 我们一般通过id值的大小研究查询中的逻辑顺序. (但是需要注意的是,它不一定完全代表真实绝对的SQL执行顺序, 是一种逻辑上的相对顺序, 在一些特殊操作中未必按照如下说明).

id相同,执行顺序由上至下

id不同, id值越大,优先级越高,越先被执行

id既有相同又有不同,不同的id值,id值越大,优先级越高,越先被执行; 相同的id值,按照从上到下的顺序执行

2.1.2 select_type

select_type表示select的查询类型,主要用于区分各种复杂的查询,例如普通查询、联合查询、子查询等

select_type的常见类型:

类型描述
SIMPLE简单的查询 (查询中不包含子查询或者UNION)
PRIMARY外层查询 (查询中若包含任何复杂的子部分)
SUBQUERY子查询
DERIVED派生表
UNION一般属于第二个SELECT, 出现在UNION之后,则被标记为UNION
UNION RESULT从UNION表获取结果的SELECT
......

2.1.3 table

table表示表名.

2.1.4 partitions

partitions分区: 只对设置了分区的表有意义, 暂时忽略.

2.1.5 type

type: type字段的作用, 用以显示MySQL决定使用哪种方式来访问表. (eg: 访问索引? 全表扫描?...)

对于type字段, 从性能的好坏划分, 我们可以分为:

常见字段表示含义
system系统表,或者极少量数据,往往不需要进行磁盘IO
const常量连接(常数级时间复杂度, 基本上是命中主键)
eq_ref多表关联查询时,主键索引或唯一索引作为关联条件进行等值扫描
ref非主键或者非唯一索引等值扫描
range范围扫描
index全索引扫描 (比如修改表中数据, 导致所有索引结构变化)
ALL全表扫描
......

2.1.6 possible_keys

possible_keys表示: 表示查询过程中有可能用到的索引( 这列数据的产生, 是SQL在优化器初步解析的时候生成,随着SQL的进一步优化有些索引可能后续优化过程发现并没有使用)

2.1.7 key

key: SQL执行中实际使用到的索引,如果为 NULL ,则没有使用索引

2.1.8 key_len

key_len: 这个使用到的索引, 占用的字节数(索引是int -> 4字节, long->8字节, float->4字节 ... )

需要注意的是: 变长字符串按照其最大宽度和占用字节计算

2.1.9 ref

ref: 表示将哪个字段或常量和key列所使用的字段进行比较。

2.1.10 rows

rows: 根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数

2.1.11 filtered

filtered: 表示按表格条件过滤的表格行的估计百分比。预估有多少行会通过查询条件的过滤。

(rows× filtered显示与下表连接的行数。例如,如果 rows为 1000, filtered为 50.00(50%),则要与下表连接的行数为 1000 × 50% = 500。)(一般它的值越大,表示索引过滤性越好;它的值越小,表示索引过滤性越差,甚至没有用到索引。)

2.1.12 Extra

Extra: 包含不适合在其他列中显示但十分重要的额外信息(附加信息) , 该列显示了MySQL在查询过程中的一些详细信息。

描述
Using filesort说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取, 也称为文件排序.
Using temporary使了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。
USING index是否用了覆盖索引
Using where表明使用了where过滤
Impossible wherewhere子句的值总是false,不能用来获取任何元组
......