分析 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 语句的第一步也是最重要的一步。

相关推荐
TDengine (老段)4 小时前
TDengine 数学函数 DEGRESS 用户手册
大数据·数据库·sql·物联网·时序数据库·iot·tdengine
TDengine (老段)4 小时前
TDengine 数学函数 GREATEST 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
安当加密4 小时前
云原生时代的数据库字段加密:在微服务与 Kubernetes 中实现合规与敏捷的统一
数据库·微服务·云原生
爱喝白开水a5 小时前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
想ai抽5 小时前
深入starrocks-多列联合统计一致性探查与策略(YY一下)
java·数据库·数据仓库
武子康5 小时前
Java-152 深入浅出 MongoDB 索引详解 从 MongoDB B-树 到 MySQL B+树 索引机制、数据结构与应用场景的全面对比分析
java·开发语言·数据库·sql·mongodb·性能优化·nosql
longgyy5 小时前
5 分钟用火山引擎 DeepSeek 调用大模型生成小红书文案
java·数据库·火山引擎
ytttr8736 小时前
C# 仿QQ聊天功能实现 (SQL Server数据库)
数据库·oracle·c#
盒马coding7 小时前
第18节-索引-Partial-Indexes
数据库·postgresql
不剪发的Tony老师7 小时前
CloudDM:一站式数据库开发管理工具
数据库