漫威宇宙入侵免安装绿色中文版
145M · 2025-12-19
文章内容收录到个人网站,方便阅读:hardyfish.top/
这种情况的核心问题可能出在索引使用方式或查询优化上。
如何正确分析 SQL 执行计划?
在 EXPLAIN 结果中,几个重要的字段:
| 字段 | 含义 | 重点 |
|---|---|---|
id | 查询执行的步骤 | 越大表示执行顺序越靠后 |
type | 访问类型 | 影响查询效率的关键 |
possible_keys | 可能使用的索引 | 可供查询选择的索引 |
key | 实际使用的索引 | 如果是 NULL,说明没用索引 |
rows | 预计扫描行数 | 值越大说明查询性能越差 |
Extra | 额外信息 | 是否 Using index 或 Using where; Using index |
问题分析:type=index 代表什么?
示例:
EXPLAIN SELECT col1 FROM my_table WHERE col2 = 'xxx';
可能返回:
+----+-------+---------------+----------+--------------------------+
| id | type | possible_keys | key | Extra |
+----+-------+---------------+----------+--------------------------+
| 1 | index | NULL | idx_col2 | Using where; Using index |
+----+-------+---------------+----------+--------------------------+
在 Extra 中 出现 Using where; Using index,意味着:
可能导致查询慢的原因
索引失效:没有满足最左前缀匹配
(a, b, c),如果 WHERE 仅 b, c,则索引失效。WHERE 子句符合索引最左匹配原则。索引筛选性差,导致大量数据扫描
status=1 这种大量重复值)会导致扫描大量行。回表查询导致性能下降
EXTRA中如果出现Using where; Using index,意味着:
优化方案:创建覆盖索引,减少回表操作
-- 假设查询 `SELECT col1 FROM my_table WHERE col2 = 'xxx'`
-- 现有索引 idx_col2(col2)
-- 改进:创建联合索引 (col2, col1) 避免回表
CREATE INDEX idx_col2_col1 ON my_table (col2, col1);
使用 LIKE '%xx' 或者 函数操作列,导致索引失效
WHERE UPPER(name) = 'JOHN' 使得 name 索引失效解决方案
| 问题 | 解决方案 |
|---|---|
索引未匹配 WHERE | 调整 SQL 确保最左匹配 |
| 索引选择性差 | 选择更具区分度的索引 |
| 需要回表查询 | 用覆盖索引优化 |
LIKE '%xx' 导致全索引扫描 | 改进索引或考虑全文索引(FULLTEXT) |
总结
当 key 有值但查询仍然很慢: