首页 > 生活经验 >

问 sql 优化的几种方法 性能调优深度详解

2026-11-12 16:45:45
最佳答案

答

sql 优化核心目标就是降低查询耗时,减少数据库扫描的数据行数,降低 CPU 内存 IO 消耗,常用优化方法包含建立合适索引,改写低效 sql 语句,优化表结构,调整 join 关联逻辑,分页优化,避免全表扫描,利用执行计划定位慢查询,sql 优化不是单纯加索引,很多时候索引建错或者 sql 写法本身有问题,就算加索引也不会生效,大表查询慢,绝大多数原因是数据库做全表扫描,或者多表关联产生笛卡尔积,还有分组排序临时表开销过大,优化的时候第一步一定要先看执行计划,确认 sql 卡在哪一步,再针对性调整,不能凭感觉盲目修改,sqlite3 mysql 等数据库都支持查看执行计划,掌握这套优化思路之后,不管是业务报表查询还是多表联查,都可以逐步把慢 sql 优化到合理速度。

主流 sql 优化方法对比表格

优化方法核心原理适用场景注意事项
合理创建索引减少扫描行数,快速定位目标数据where 条件,join 关联字段,order by group by 字段索引不是越多越好,会拖慢 insert update delete 写入速度
避免 select 星号只查询需要的字段,减少数据传输和内存占用所有查询语句不要一次性读取不需要的大字段
优化 join 关联保证关联字段类型一致,关联字段建立索引多表联查 sql关联字段类型不匹配会造成索引失效
where 条件优化避免索引字段使用函数运算,避免模糊匹配前导通配符条件筛选查询like 百分号开头会让索引失效
分页优化大分页 limit 优化,避免深分页扫描大量数据列表分页查询limit 大偏移量性能很差,推荐游标分页
group by order by 优化分组排序字段建索引,减少临时表和文件排序分组统计报表 sql不合理排序会产生 filesort
子查询改写把低效子查询改成 join 关联嵌套子查询 sql部分数据库子查询会生成临时表,性能低于 join
表结构优化拆分大表,字段类型精简,垂直水平分表千万级以上大表分表会增加业务代码复杂度

优化操作执行步骤

第一步 抓取慢 sql,开启慢查询日志或者直接定位业务里执行很慢的 sql 语句,确认是单表查询慢还是多表联查慢。

第二步 查看执行计划,使用 explain 查看执行计划,判断是否出现全表扫描,索引有没有命中,是否存在临时表文件排序。

第三步 检查索引,根据 where join group by order by 字段创建联合索引,遵循最左前缀原则,同时删除长期不用的冗余索引。

第四步 改写 sql 语句,把 select 星号改成指定字段,修正会让索引失效的写法,前导模糊查询,字段函数运算,隐式类型转换这类写法全部修正。

第五步 优化多表关联,调整表关联顺序,确认关联字段数据类型长度完全一致,给关联字段补充索引。

第六步 优化深分页,普通 limit offset 大偏移改成基于主键的游标分页方案,减少扫描行数。

第七步 优化完成之后再次执行 explain,并且实测查询耗时,对比优化前后的数据,确认性能提升,同时验证查询结果数据没有出错。

索引失效常见清单

1 where 里面对索引字段使用函数,比如 date 函数,substring 函数

2 索引字段使用不等于,or 条件里面部分字段没有索引

3 like 以百分号开头模糊查询

4 索引字段发生隐式类型转换

5 联合索引没有满足最左前缀匹配规则

综合来看,sql 优化优先依靠执行计划定位瓶颈,优先做索引优化和 sql 语句改写,大表才考虑分表这类结构改造,优化的时候要平衡查询性能和写入性能,索引不能无限制添加,每次优化都要校验查询结果正确性,不能只追求速度而造成数据错误。

【常见问题】

问题 1 sql 优化的时候是不是索引越多越好

回答 1 sql 优化并不是索引越多越好,索引可以提升查询速度,但是会增加 insert update delete 写入开销,sql 优化需要平衡查询和写入性能,只保留业务需要的索引。

问题 2 sql 优化里面 explain 有什么作用

回答 1 sql 优化流程里面 explain 是核心工具,用来查看执行计划,判断是否全表扫描,确认索引是否命中,是做 sql 优化必备的分析手段。

问题 3 sqlite3 可以使用这些 sql 优化的几种方法吗

回答 1 sqlite3 同样适用大部分 sql 优化的几种方法,包括创建索引,改写 sql,查看执行计划,但是 sqlite3 没有 mysql 完整的慢查询日志,大表分表能力也比较有限。

【免责申明】

本内容基于主流 SQL 数据库通用优化原理整理,不同数据库优化机制存在差异,内容仅供学习参考,优化方案需要结合真实表数据量业务场景测试验证,不保证所有慢查询都可以达到预期提速效果。