惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
Vercel News
Vercel News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Y
Y Combinator Blog
The Cloudflare Blog
Last Week in AI
Last Week in AI
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
V
Visual Studio Blog
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
博客园 - 司徒正美
B
Blog RSS Feed
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
L
LangChain Blog

博客园 - 野鹤闲人

ubantu 耳机调试 keepalived+nginx msg广播到同一个group中,怎么保证所有consumer都消费到,Rocketmq和rabbitmq 分别是怎么做的 CountDownLatch/CyclicBarrier 区别 机器缩容要注意哪些问题 IO模型有哪几种 ConcurrentSkipListMap 并发安全实现 TreeMap hive 小文件优化 redis缓存雪崩问题解决 CAS原理 docker的常用命令 k8s的常用组件,和命令 mysql B+树 如果有3层,能保存多少数据 如何保证rabbitmq或kafka 消息不丢失,从生产到消费端全过程 java排查工具 JAVA 强软弱虚引用 git Spring 事务失效
mysql优化语句时,关注哪几列 extra要关注吗
野鹤闲人 · 2026-01-27 · via 博客园 - 野鹤闲人

想知道 MySQL 优化 SQL 语句时需要关注的核心维度,以及EXTRA列的重要性 —— 核心结论:优化 SQL 时需重点关注执行计划的关键列(type、key、rows、EXTRA 等),其中EXTRA列是判断 SQL 是否存在性能问题(如文件排序、临时表、全表扫描)的核心依据,必须重点关注。

下面先梳理优化 SQL 需关注的核心列,再拆解EXTRA列的关键取值,结合基金系统(如 TA 账户查询、交易流水统计)的实际场景说明:

一、MySQL 优化 SQL 需关注的核心列(执行计划EXPLAIN输出)

执行EXPLAIN + SQL后,重点看以下 6 列,覆盖索引、扫描方式、执行效率等核心维度:

列名核心关注要点基金系统典型场景
id 执行顺序(数字越大越先执行),是否存在子查询 / 派生表导致的多执行节点 交易流水统计 SQL 中,子查询的id层级过多,导致执行顺序混乱
type 访问类型(性能从优到差:system > const > eq_ref > ref > range > ALL),需至少达到range,避免ALL(全表扫描) TA 账户查询 SQL 出现ALL,说明未用到索引,百万级账户表全扫耗时超秒级
key 实际使用的索引(NULL 表示未用索引),需与预期索引一致 基金代码 + 用户 ID 的联合索引未被使用,key为 NULL,需调整索引或 SQL
key_len 使用的索引长度(越长越精准,但需合理),判断索引是否被充分利用 联合索引只用到前半段(如仅用基金代码,未用用户 ID),key_len偏小
rows 预估扫描行数(越接近实际结果越好),行数越大执行越慢 赎回流水查询rows显示 100 万,实际仅需 10 条,说明索引失效
EXTRA 执行额外信息(核心判断依据),重点关注是否有文件排序、临时表、全表扫描等 行情统计 SQL 出现Using filesort,排序耗时占比超 80%,需优化索引

二、EXTRA列必须重点关注的核心取值(按优先级排序)

EXTRA列直接暴露 SQL 的 “性能坑”,以下是基金系统中高频出现的关键取值,优化优先级从高到低:

1. 严重性能问题(必须立即优化)

EXTRA取值含义基金系统场景 & 优化方案
Using filesort 未用索引排序,触发磁盘 / 内存文件排序(耗时随数据量指数级增长) 基金净值排行 SQL:ORDER BY net_value未用索引,百万级数据排序耗时超 5 秒 → 给net_value建索引
Using temporary 创建临时表(如 GROUP BY/ORDER BY 无合适索引),临时表会占用磁盘 / 内存 交易流水按日期分组统计:GROUP BY trade_date无索引 → 建trade_date索引,避免临时表
Using index condition 索引条件下推(ICP),看似优化但可能是索引未覆盖全部条件 TA 账户查询:WHERE fund_code='000001' AND user_id>10000仅用fund_code索引 → 建联合索引
Using where; Using join buffer 联表查询未用索引,使用连接缓冲区(性能差) 账户 + 交易流水联表查询:user_id未建索引 → 给关联字段user_id建索引

2. 理想状态(无需优化)

EXTRA取值含义说明
Using index 覆盖索引(无需回表查询),性能最优 TA 账户查询:SELECT ta_account_id FROM ta_account WHERE fund_code='000001',索引覆盖查询字段
Using where 仅用 WHERE 过滤数据,无其他额外操作(需结合type列,避免ALL+Using where type=ALLUsing where,仍是全表扫描,需优化索引

3. 无意义 / 低优先级

EXTRA取值含义说明
Impossible WHERE WHERE 条件恒不成立(如1=0),无数据返回 测试 SQL 常见,业务 SQL 需排查条件是否错误
Select tables optimized away 聚合函数(如 COUNT (*))直接从索引获取结果,无需扫描表 基金总份额统计:SELECT COUNT(*) FROM fund_share,索引直接返回结果,性能最优

三、基金系统 SQL 优化实战示例(结合EXTRA列)

问题 SQL(交易流水统计,耗时 3 秒)

SELECT user_id, SUM(trade_amount) 
FROM fund_trade 
WHERE trade_date >= '2025-01-01' 
GROUP BY user_id 
ORDER BY SUM(trade_amount) DESC;

执行计划EXTRA显示:Using where; Using temporary; Using filesort

优化步骤:

  1. 建联合索引:CREATE INDEX idx_trade_date_user ON fund_trade(trade_date, user_id, trade_amount)
  2. 优化 SQL(避免 SUM () 排序):
SELECT user_id, trade_sum 
FROM (SELECT user_id, SUM(trade_amount) AS trade_sum 
      FROM fund_trade 
      WHERE trade_date >= '2025-01-01' 
      GROUP BY user_id) t 
ORDER BY trade_sum DESC;

优化后EXTRAUsing index(覆盖索引),耗时降至 50ms。

总结

1. 优化 SQL 的核心关注列

优先看type(避免全表扫描)→ key(确认索引生效)→ rows(预估扫描行数)→ EXTRA(排查性能坑),四列缺一不可。

2. EXTRA列的核心价值

是 SQL 性能问题的 “晴雨表”,只要出现Using filesort/Using temporary/Using join buffer,就说明存在优化空间;出现Using index则是理想状态。

3. 基金系统优化关键

TA 账户、交易流水等核心表的 SQL,需杜绝ALL(type 列)、Using filesort/Using temporary(EXTRA 列),优先用覆盖索引减少回表,避免大表全扫 / 排序。