一、前言
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)分析。