637 words
3 minutes
SQL 系列(七):性能优化实战

AI 智能总结

SQL 7 性能优化实战#

SQL优化是数据库调优核心,整套流程:定位慢SQL → 分析执行计划 → 改写SQL → 索引优化 → 大表治理 → 参数调优。

一、慢查询定位与执行计划#

1. 慢SQL捕获#

  • MySQL:开启慢查询日志 slow_query_log,筛选超过阈值SQL;
  • Oracle:AWR、v$sql视图定位低效语句;
  • SQLServer:扩展事件、查询存储捕获慢查询。

2. 查看执行计划语法#

-- MySQL
EXPLAIN SELECT * FROM employee WHERE name = 'test';
-- Oracle
EXPLAIN PLAN FOR SELECT * FROM employee WHERE name = 'test';
-- SQLServer
SET SHOWPLAN_XML ON;
SELECT * FROM employee WHERE name = 'test';

执行计划重点观察指标:
扫描类型、预估行数、是否使用索引、有无Using filesort/Using temporary(MySQL)。

二、SQL语句优化要点#

1. Join优化#

  1. 小表驱动大表,驱动表优先过滤缩小数据集;
  2. 关联字段必须建立索引;
  3. 优先INNER JOIN,谨慎使用LEFT JOIN;
  4. 禁止多表不加关联条件产生笛卡尔积。

2. 规避回表(InnoDB重点)#

InnoDB二级索引仅存储主键,查询非索引字段会触发回表。
解决方案:建立覆盖索引

-- 建立联合索引,查询字段全部包含,无需回表
CREATE INDEX idx_name_salary ON employee(name,salary);
SELECT name,salary FROM employee WHERE name='test';

3. 索引失效规避#

禁止索引列运算、隐式转换、前置模糊匹配like '%xx'。

三、大表优化方案#

  1. 冷热数据分离,历史数据归档;
  2. 水平/垂直分表;
  3. 避免SELECT *,只查询所需字段;
  4. 大事务拆分,减少锁持有时间;
  5. 禁用大表ORDER BY、GROUP BY无索引场景。

四、数据库参数调优(方言区分)#

MySQL(InnoDB)核心参数#

innodb_buffer_pool_size = 50%~70%物理内存 # 缓冲池,最重要参数
innodb_flush_log_at_trx_commit = 1
sort_buffer_size、join_buffer_size # 会话缓冲区,不宜过大

Oracle#

重点调优SGA、PGA;调整db_cache_size控制数据缓存,优化重做日志文件大小。

SQLServer#

调整max server memory限制内存;合理配置索引填充因子、并行度阈值。

五、通用优化准则#

  1. 优先优化索引与SQL写法,参数调优属于最后手段;
  2. 不要依赖数据库自动优化器,复杂SQL人工改写;
  3. 线上禁止随意执行不带limit的全表扫描;
  4. 区分数据库特性:InnoDB重视缓冲池,Oracle依靠SGA,三者参数无法通用。

开发建议#

执行计划是调优第一手段;回表、无效索引、不当Join是线上最常见性能瓶颈;大表提前规划归档与分表策略,避免后期重构。

SQL 系列(七):性能优化实战
https://fuwari.vercel.app/posts/sql-series/sql-07-performance-optimization/
Author
Zero02
Published at
2025-05-13
License
CC BY-NC-SA 4.0