Mysql

一、EXPLAIN 执行计划

1. 基本语法

SELECT 语句前添加 EXPLAINDESC,即可查看 SQL 执行计划:

sql

复制代码
EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件;

2. 核心字段含义

表格

字段 含义
id 查询序列号,id 相同则从上到下执行;id 不同则值越大越先执行
select_type 查询类型,如 SIMPLE(简单查询)、PRIMARY(主查询)、UNION(联合查询)等
type 连接类型,性能从好到差:NULL > system > const > eq_ref > ref > range > index > ALL
possible_key 可能被使用的索引列表
key 实际使用的索引,为 NULL 表示未使用索引
key_len 索引使用的最大字节数,越短越好
rows 预估需要扫描的行数,InnoDB 中为估算值
filtered 返回行数占读取行数的百分比,值越大越好

二、索引使用规则

1. 验证索引效率

通过对比建索引前后的 SQL 耗时,验证索引效果:

  1. 无索引时执行查询: sql

    复制代码
    SELECT * FROM tb_sku WHERE sn = '100000003145001';
  2. 创建索引: sql

    复制代码
    CREATE INDEX idx_sku_sn ON tb_sku(sn);
  3. 再次执行相同查询,对比耗时。

2. 最左前缀法则

联合索引需从最左列开始查询,不能跳过中间列,否则后续列索引失效。

  • ✅ 有效:WHERE profession = '软件工程' AND age = 31 AND status = '0'
  • ❌ 部分失效:WHERE age = 31 AND status = '0'(跳过最左列 profession

3. 范围查询

联合索引中若出现 >/< 范围查询,范围查询右侧的列索引将失效

4. 索引失效场景

  • 字符串不加引号:字符串类型字段未加引号,索引失效。
  • 头部模糊查询LIKE '%xxx' 会导致索引失效;仅尾部模糊 LIKE 'xxx%' 可使用索引。
  • or 连接条件or 分割的条件中,若后一列无索引,则所有相关索引都不会被使用。
    • 示例:WHERE id = 10 OR age = 23,若 age 无索引,则 id 的索引也会失效。
  • 索引列运算:在索引列上进行函数 / 算术运算,索引失效。
  • 数据分布影响:若 MySQL 评估使用索引比全表扫描更慢,则会选择不使用索引。

三、SQL 性能分析工具

1. 慢查询日志

  • 记录执行时间超过 long_query_time(默认 10 秒)的 SQL。

  • 配置开启(/etc/my.cnf):

    ini

    复制代码
    slow_query_log=1
    long_query_time=2
  • 日志路径:/var/lib/mysql/localhost-slow.log

2. PROFILE 分析

查看 SQL 执行各阶段耗时:

sql

复制代码
-- 查看所有 SQL 耗时概况
SHOW PROFILES;
-- 查看指定 query_id 的 SQL 各阶段耗时
SHOW PROFILE FOR QUERY query_id;
-- 查看指定 query_id 的 SQL CPU 使用情况
SHOW PROFILE CPU FOR QUERY query_id;

3. SQL 执行频率统计

统计 INSERT/UPDATE/DELETE/SELECT 执行频次:

sql

复制代码
SHOW GLOBAL STATUS LIKE 'Com_______';

可查看 Com_selectCom_insert 等操作的累计次数。

相关推荐
m0_609160491 天前
Vue 中对象键名重复导致数据被覆盖的原理与解决方案
jvm·数据库·python
2401_880071401 天前
SQL中如何查找特定的空值行:WHERE IS NULL深度解析
jvm·数据库·python
Irissgwe1 天前
redis之哨兵(Sentinel)
数据库·redis·sentinel·主从复制·哨兵
Gauss松鼠会1 天前
浅谈GaussDB (DWS)技术【玩转PB级数仓GaussDB(DWS)】
数据库·经验分享·sql·数据库开发·gaussdb·经验总结
2401_831419441 天前
如何正确解析含 HTML 实体的 XML 字符串并渲染为 HTML 表格
jvm·数据库·python
彳亍1011 天前
如何排查Oracle客户端连接慢_DNS解析超时与sqlnet配置优化
jvm·数据库·python
2301_781571421 天前
如何在 React Native 中高效缓存视频并使用 expo-av 播放
jvm·数据库·python
m0_609160491 天前
mysql表锁监控命令_诊断MyISAM表锁定问题的方法
jvm·数据库·python
iuvtsrt1 天前
PHP 中使用 GnuPG 实现 PGP 加密与解密的完整实践指南
jvm·数据库·python
天若有情6731 天前
从零搭建局域网手机遥控电脑网页项目,吃透工程化与架构设计思维
服务器·前端·数据库·算法·开源·node·工程化