# 数据库性能优化实战:SQL查询调优与索引设计
一、SQL查询调优的核心方法论
1.1 执行计划(Execution Plan)深度解析
执行计划是SQL优化的核心工具,通过EXPLAIN命令可获取查询的执行路径。以MySQL为例:
EXPLAIN SELECT * FROM orders
WHERE user_id = 1001 AND status = 'completed';
典型输出包含以下关键指标(表1):
| 列名 | 说明 | 优化关注点 |
|---|---|---|
| type | 访问类型 | 需避免ALL(全表扫描) |
| rows | 扫描行数 | 应与实际返回行数接近 |
| Extra | 附加信息 | Using filesort需警惕 |
1.2 索引失效的七大场景
(1)隐式类型转换:当字段定义为VARCHAR而查询使用数字时,索引将失效
(2)前导通配符查询:LIKE '%keyword'无法使用索引
(3)函数操作字段:WHERE YEAR(create_time) = 2023导致索引失效
二、索引设计的工程实践
2.1 B+树索引的物理实现
MySQL的InnoDB引擎采用B+树结构,其特性包括:
- 叶子节点形成双向链表,支持范围查询
- 非叶子节点仅存储键值,单个节点可存储约1200个键(按16KB页计算)
2.2 复合索引(Composite Index)设计原则
建立(user_id, status)的复合索引时:
ALTER TABLE orders ADD INDEX idx_user_status (user_id, status);
遵循最左前缀原则,以下查询可命中索引:
(a)WHERE user_id = ?
(b)WHERE user_id = ? AND status = ?
但单独查询status时无法使用该索引
三、实战性能优化案例
3.1 分页查询优化
原始慢查询:
SELECT * FROM logs
ORDER BY create_time DESC
LIMIT 1000000, 20; -- 执行时间2.3秒
优化方案:
SELECT * FROM logs
WHERE create_time < '2023-06-01' -- 添加游标条件
ORDER BY create_time DESC
LIMIT 20; -- 执行时间0.02秒
3.2 覆盖索引(Covering Index)实践
为高频查询SELECT user_id, score FROM users WHERE city='北京'创建覆盖索引:
CREATE INDEX idx_city_score ON users(city, score, user_id);
通过EXPLAIN可见Extra列显示"Using index",实现零回表查询
四、性能监控与调优工具链
推荐工具矩阵:
- 慢查询日志(Slow Query Log)分析
- Percona Toolkit的pt-query-digest
- 索引建议工具:MySQL Index Tuning Wizard
通过本文的SQL调优方法和索引设计原则,我们可将典型OLTP系统的查询性能提升5-10倍。建议定期进行索引选择性分析(公式1):
选择性 = COUNT(DISTINCT column)/COUNT(*) -- 高于0.1适合建索引
SQL优化, 数据库索引, 查询性能, MySQL调优, 执行计划分析, B+树索引, 覆盖索引