一、前言
- SQL调优是提升数据库性能的关键手段。
- 需结合索引优化、SQL语句优化、执行计划分析及数据库架构设计等多方面综合处理。
二、索引优化
- 创建合适索引
- 高频查询字段:对WHERE、JOIN、ORDER BY涉及的字段创建索引,尤其是区分度高的字段(如用户ID)。
- 覆盖索引:通过包含查询所需字段的联合索引,减少回表查询(如INDEX (a, b)覆盖SELECT a, b FROM table)。
- 避免冗余索引:联合索引的顺序需匹配查询条件(如WHERE a=? AND b=?适合(a,b)索引)。
- 索引失效场景
- 对索引列进行函数计算(如WHERE YEAR(date_column)=2025)。
- 类型不匹配(如字符串字段用数字查询)。
- 模糊查询以通配符开头(LIKE ‘%abc’)。
三、SQL语句优化
- 减少数据扫描
- 仅查询必要字段:避免SELECT *,减少数据传输量。
- 分页优化:大表分页时,避免LIMIT 100000, 10,改用WHERE id 100000 LIMIT 10(基于有序主键)。
- 简化复杂查询
- 用JOIN替代子查询:子查询易导致全表扫描,改用INNER JOIN或EXISTS。
- 避免全表扫描:通过EXPLAIN检查是否命中索引,关注type=ALL的查询。
- 聚合与排序优化
- 预计算统计值:对频繁统计的字段(如COUNT、SUM)可定期预存结果。
- 利用索引排序:对ORDER BY字段加索引,避免临时表排序(Using filesort)。
四、执行计划与统计信息
- 分析执行计划
- 用EXPLAIN查看执行步骤,需关注: key(使用的索引)、rows(扫描行数)、Extra(是否出现临时表或文件排序)。
- 强制索引:在优化器选择不当时,通过FORCE INDEX干预(如SELECT FROM table FORCE INDEX(idx_a))。
- 更新统计信息
- 数据库依赖统计信息选择执行计划,定期更新表统计信息(如ANALYZE TABLE)。
五、数据库架构设计优化
- 分库分表
- 水平拆分:按时间或哈希键拆分大表(如日志表按月分区)。
- 垂直拆分:将宽表拆分为高频字段和低频字段表,减少单行数据量。
- 读写分离与缓存
- 主从架构:将读请求分流到从库,减轻主库压力。
- 缓存热点数据:使用Redis缓存高频查询结果(如用户信息)。
六、高级调优技巧
- 参数调优
- 内存分配:调整缓冲池大小(如innodbbufferpool_size),减少磁盘IO。
- 并发控制:合理设置连接池大小(避免过多连接争抢资源)。
- 并行查询
- 对大查询启用并行执行(如/PARALLEL(8) /),利用多核资源加速。
- 下推计算
- 将过滤、聚合操作下推到存储层执行(如TiDB的LogicalView优化)。
七、实战案例
原语句:SELECT FROM orders LIMIT 9000000, 10(耗时17秒)。
优化后:SELECT FROM orders WHERE id 9000000 ORDER BY id LIMIT 10(耗时0.3秒)。
原语句:子查询导致全表扫描。
优化后:改用INNER JOIN并添加联合索引,执行时间从5秒降至50毫秒。
八、总结
- SQL调优需结合具体场景,通过分析执行计划、优化索引与语句、调整数据库架构逐步解决问题。
- 调优后需持续监控性能,并随着数据增长动态调整策略。
- 对于复杂系统,可借助数据库内置工具(如TiDB的慢查询日志、执行计划管理)或第三方监控平台(如Prometheus)分析。