MySQL 优化—— SQL 性能分析

SQL 性能分析

SQL 执行频率

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

SHOW GLOBAL STATUS LIKE 'Com_______'; 七个下划线代表这个七个占位。

查询数据库中整体的 CURD 频次,一般针对 select 比较多的数据库。

慢查询日志

慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认 10 s)的所有 SQL 语句的日志

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

properties 复制代码
# 开启 MySQL 慢查询日志开关
slow_query_log=1

# 设置慢查询的时间为 2 秒,SQL 语句执行时间操作 2 s,就会视为慢查询,并记录到慢查询日志中。
long_query_time=2

配置完成需重启 MySQL 服务器进行测试,查看慢查询日志文件的信息:/var/lib/mysql/localhost-slow.log

查看慢查询日志的开关情况

show variables like 'slow_query_log';

profile 详情

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

SELECT @@have_profiling;

默认情况下是关闭的(0),通过 set 语句可以选择在 session/global 级别开启 profile

SELECT @@profiling;:查看 profiling 是否开启

SET profiling = 1;:开启 profiling

相关操作效果:

sql 复制代码
# 查看每一条 SQL 的耗时基本情况
show profiles;

# 查看指定 query_id 的 sql 语句各个阶段的耗时情况
show profile for query query_id;

# 查看指定 query_id 的 SQL 语句 CPU 的使用情况
show profile cpu for query query_id;
  1. show profiles\

    列分别是:SQL 语句的 id,执行时间秒,具体的 SQL 语句。

  2. show profile for query 25

    这条语句在各个状态的耗时详细情况。

  3. show profile cpu for query 79

    可以看到具体语句 CPU 的情况。

explain 执行计划

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

语法:explain select 语句

explain 具体字段解析:

那么一般情况下重点关注的是以下几个字段:

  • type:一般业务情况下是优化到 const、ref(如果 type 类型是在后面的话)
  • possible_keys:可能会用到的索引与实际用到的索引进行对比,看看是否能通过索引来进行优化。
  • key:实际用到的索引。
  • key_len:索引的最大长度,越短越好(不丢失精度前提下)。
  • filtered:值越大越好
  • Extra:其他信息,也比较重要。

小结:

对于 SQL 性能分析这章,学习了 4 个点:

  1. SQL 执行频率:查看数据库中查询是否执行频率最高。
  2. 慢查询日志:查询哪些 SQL 语句超过了规定时间,标记为慢查询。
  3. profile 详情:查看具体的 SQL 语句执行的耗时时间,包括各个阶段的用时以及 CPU 情况。
  4. explain\desc:查看具体 SELECT 执行计划,根据查询到的字段去进行 SQL 优化的方案。

后续将学习 SQL 优化的具体方案,以及不同的 SQL 优化。

相关推荐
万亿少女的梦1684 分钟前
基于Spring Boot的楚雄旅游景区门票售卖系统设计与实现
java·spring boot·mysql·vue·系统设计
talenteddriver1 小时前
MySQL的ABC联合索引
mysql
wear工程师1 小时前
可重复读能不能防幻读?MVCC 和 Next-Key Lock 到底谁在起作用
mysql·面试
AOwhisky2 小时前
Kubernetes(K8s)学习笔记(第十四期):集群存储与有状态应用(下篇):StatefulSet 有状态应用管理
redis·笔记·mysql·云原生·kubernetes·云计算·k8s
EntyIU2 小时前
CentOS-高可用部署手册-MySQL双主RedisNginx
linux·mysql·centos
承渊政道2 小时前
【MySQL数据库学习】(MySQL访问、连接池原理与简易网站数据流动)
数据库·学习·mysql·mysql访问·连接池原理
wefg15 小时前
【MySQL】索引(索引底层原理/创建/查看/删除主键、普通、联合、前缀、全文索引)
数据库·mysql
周杰伦的稻香12 小时前
MySQL8.0+中引入的SET_USER_ID权限迭代SUPER权限指定 DEFINER
数据库·mysql
韩楚风14 小时前
【参天引擎】Cantian 服务端框架全景解析:进程架构、模块组成与交互关系
数据库·mysql·架构·cantian
vigor51216 小时前
MySQL通过Mango实现分库分表
android·数据库·mysql