Photo by Lorem Ipsum
637 words
3 minutes
SQL 系列(七):性能优化实战
SQL 教程
Posts in this series (10)AI 智能总结
SQL 7 性能优化实战
SQL优化是数据库调优核心,整套流程:定位慢SQL → 分析执行计划 → 改写SQL → 索引优化 → 大表治理 → 参数调优。
一、慢查询定位与执行计划
1. 慢SQL捕获
- MySQL:开启慢查询日志
slow_query_log,筛选超过阈值SQL; - Oracle:
AWR、v$sql视图定位低效语句; - SQLServer:扩展事件、查询存储捕获慢查询。
2. 查看执行计划语法
-- MySQLEXPLAIN SELECT * FROM employee WHERE name = 'test';
-- OracleEXPLAIN PLAN FOR SELECT * FROM employee WHERE name = 'test';
-- SQLServerSET SHOWPLAN_XML ON;SELECT * FROM employee WHERE name = 'test';执行计划重点观察指标:
扫描类型、预估行数、是否使用索引、有无Using filesort/Using temporary(MySQL)。
二、SQL语句优化要点
1. Join优化
- 小表驱动大表,驱动表优先过滤缩小数据集;
- 关联字段必须建立索引;
- 优先INNER JOIN,谨慎使用LEFT JOIN;
- 禁止多表不加关联条件产生笛卡尔积。
2. 规避回表(InnoDB重点)
InnoDB二级索引仅存储主键,查询非索引字段会触发回表。
解决方案:建立覆盖索引
-- 建立联合索引,查询字段全部包含,无需回表CREATE INDEX idx_name_salary ON employee(name,salary);SELECT name,salary FROM employee WHERE name='test';3. 索引失效规避
禁止索引列运算、隐式转换、前置模糊匹配like '%xx'。
三、大表优化方案
- 冷热数据分离,历史数据归档;
- 水平/垂直分表;
- 避免
SELECT *,只查询所需字段; - 大事务拆分,减少锁持有时间;
- 禁用大表
ORDER BY、GROUP BY无索引场景。
四、数据库参数调优(方言区分)
MySQL(InnoDB)核心参数
innodb_buffer_pool_size = 50%~70%物理内存 # 缓冲池,最重要参数innodb_flush_log_at_trx_commit = 1sort_buffer_size、join_buffer_size # 会话缓冲区,不宜过大Oracle
重点调优SGA、PGA;调整db_cache_size控制数据缓存,优化重做日志文件大小。
SQLServer
调整max server memory限制内存;合理配置索引填充因子、并行度阈值。
五、通用优化准则
- 优先优化索引与SQL写法,参数调优属于最后手段;
- 不要依赖数据库自动优化器,复杂SQL人工改写;
- 线上禁止随意执行不带limit的全表扫描;
- 区分数据库特性:InnoDB重视缓冲池,Oracle依靠SGA,三者参数无法通用。
开发建议
执行计划是调优第一手段;回表、无效索引、不当Join是线上最常见性能瓶颈;大表提前规划归档与分表策略,避免后期重构。