SQL性能分析

SQL执行频率

MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信
息。通过如下指令,可以查看当前数据库的 INSERT、UPDATE、DELETE、SELECT 的访问频次:

  1. -- session 是查看当前会话 ;
  2. -- global 是查询全局数据 ;
  3. SHOW GLOBAL STATUS LIKE 'Com_______';

Com_delete:删除次数
Com_insert:插入次数
Com_select:查询次数
Com_update:更新次数

通过上述指令,我们可以查看到当前数据库到底是以查询为主,还是以增删改为主,从而为数据 库优化提供参考依据。

  • 如果是以增删改为主,我们可以考虑不对其进行索引的优化。
  • 如果是以查询为主,那么就要考虑对数据库的索引进行优化了。

那假如说是以查询为主,我们又该如何定位针对于那些查询语句进行优化呢? 次数我们可以借助于慢查询日志。

慢查询日志

慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。
MySQL的慢查询日志默认没有开启,我们可以查看一下系统变量 slow_query_log。

如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:

开启MySQL慢日志查询开关

slow_query_log=1

设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志

long_query_time=2

配置完毕之后,通过以下指令重新启动MySQL服务器进行测试,查看慢日志文件中记录的信息
/var/lib/mysql/localhost-slow.log。

systemctl restart mysqld

这样,通过慢查询日志,就可以定位出执行效率比较低的SQL,从而有针对性的进行优化。

Profile详情

show profiles 能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。通过have_profiling
参数,能够看到当前MySQL是否支持profile操作:

SELECT @@have_profiling ;

image.png
可以看到,当前MySQL是支持 profile操作的,但是开关是关闭的。可以通过set语句在
session/global级别开启profiling:

SET profiling = 1;

执行一系列的业务SQL的操作,然后通过如下指令查看指令的执行耗时:

— 查看每一条SQL的耗时基本情况 show profiles; image.png

— 查看指定query_id的SQL语句各个阶段的耗时情况 show profile for query query_id; image.png

— 查看指定query_id的SQL语句CPU的使用情况 show profile cpu for query query_id;

explain

EXPLAIN 或者 DESC命令获取 MySQL 如何执行 SELECT 语句的信息,包括在 SELECT 语句执行过程中表如何连接和连接的顺序。

— 直接在select语句之前加上关键字 explain / desc EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件 ;

image.png

Explain 执行计划中各个字段的含义:
image.png

SQL优化