分析 SQL 语句的一般步骤

analyse-sql

数据库的性能调优是一个很大的话题。但是对于开发人员来讲,掌握一些常用的 SQL 优化手段却不是什么难事。

从本章节开始,将连载总结常用的适合于开发人员的 SQL 优化手段与大家分享。

要想解决性能优化的问题,首先要想办法发现哪些 SQL 有性能问题。通过下面这几个手段可以比较准确的定位到有问题的 SQL 进行分析优化。

Show status 命令了解各种 SQL 的执行频率

在每一个 mysql session 中都可以使用 show status 命令查看当前数据库服务器的状态信息。如下所示:

Com_xxx 表示每个 xxx 语句执行的次数。具体每个参数的意思你可以通过官方手册进行查询。总而言之,show status 向你展示了当前 mysql 服务器的运行状态。

慢查询日志

慢查询日志是 mysql 自带的几种日志中的一种。它会自动的记录任何查询时间超出你设置的自定义时间的 sql 语句到你指定的日志目录中。通过慢查询日志可以定位到执行效率较低的具体的 SQL 语句。

打开慢查询日志的方法等由于每个版本的 mysql 都有不同,请查阅相关的官方文档。

Explain

通过慢查询日志,我们可以查询到效率低下的 SQL 语句。对于这些 SQL 语句又应该如何去分析它问题出在哪里呢?

explain select 语句所返回的结果包含了该查询语句的执行细节。

具体每一个列的含义可对照官方手册。这里我们只提最主要的一个列的含义【type】:访问类型。

常见的访问类型如下:

  • all 全表扫描
  • index 索引全表扫描。按照索引顺序扫描全表。避免排序工作。但实际上由于查询的字段不是在索引中,实际上还是走了全表扫描。
  • range 索引范围扫描 如: <、>、between 等操作符
  • ref 使用非唯一索引扫描或前缀扫描。
  • eq-ref 每次与之前的表合并行都只在该表读取一行,这是除了 system,const 之外最好的一种。
  • const、system 当检索条件对应到索引中为固定的值时,查询类型为 const。当查询的表只有一行时,查询类型为 system。
  • NULL 不需要检索表就能得到结果,如 select 1

从上到下,性能由最差到最好。一般来说,至少也要优化语句达到 range 这个等级。

Extra 列

show profile 分析 SQL

show profle 能够在做 SQL 优化时帮助我们了解时间都耗费到哪里去了。

通常来说,对于一般的开发人员来讲 Explain 已经足够解决问题了。对于相关 show profile 的信息请查阅 mysql 官方手册。

trace 分析优化器

mysql 5.6 提供了对 SQL 的跟踪 trace。该功能进一步展示了优化器是如何选择执行计划的。对于开发人员来讲,explain 是最常用的分析手段。若对 trace 有兴趣请查阅相关的 mysql 官方手册。

总结

性能优化最忌讳之一便是无用功优化。准确的找出问题 SQL 以及分析其原因,是优化 SQL 语句的第一步也是最重要的一步。

相关推荐
迷枫71213 分钟前
DM8 目录结构与常用排查入口梳理
服务器·数据库
Mr.Daozhi1 小时前
RAG 进阶实战:跑通 Demo 后我连续翻了 6 次车,逐一修复才真正可用(含 Gradio Web 版)
前端·数据库·langchain·大模型·gradio·rag·科研工具
小程故事多_801 小时前
Claude Code自定义workflow skills用法
数据库·人工智能·智能体
大鹏说大话1 小时前
SQL 排序与分组实战:解决“分组后取最新数据“
android·java·数据库
夏贰四2 小时前
数据建模工具如何筑牢数据根基?数据建模工具怎样落实标准体系?
数据库·数学建模·数据建模工具
程序猿阿伟3 小时前
《一套完整方法论:搞定图形应用的Docker镜像优化》
数据库·docker·容器
二等饼干~za8986683 小时前
geo优化源码开发搭建技术分享
大数据·网络·数据库·人工智能·音视频
数据库小学妹4 小时前
HTAP混合负载架构:如何用一个数据库同时搞定交易和分析
数据库·经验分享·架构·dba
wuxinyan1234 小时前
工业级大模型学习之路029:解决双智能体调用数据库报错问题
数据库·人工智能·python·学习·智能体