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_67848545几秒前
如何利用虚拟 DOM 实现无痕刷新?基于 VNode 对比的状态保持技巧
jvm·数据库·python
qq_342295823 分钟前
CSS如何实现透明背景效果_通过RGBA色彩模式控制透明度
jvm·数据库·python
panzer_maus11 分钟前
MySQL 索引介绍与索引优化的简单介绍
数据库·mysql
Greyson119 分钟前
CSS如何处理超长文本换行问题_结合word-wrap属性
jvm·数据库·python
captain37622 分钟前
事务___
java·数据库·mysql
justjinji26 分钟前
如何批量更新SQL数据表_使用UPDATE JOIN语法提升效率
jvm·数据库·python
爱学习的小邓同学1 小时前
MySQL --- MySQL数据类型
数据库·mysql
weixin_580614001 小时前
MySQL存储过程中如何防止SQL注入_使用参数化查询规范
jvm·数据库·python
2401_837163891 小时前
PHP源码开发用台式机还是笔记本更合适_硬件选型对比【方法】
jvm·数据库·python
baidu_340998821 小时前
mysql修改列名会导致程序报错吗_Change Column语法与兼容性
jvm·数据库·python