SQL 道场
返回路线图

MODULE 6 / Senior

性能与优化

让查询跑得快:EXPLAIN、索引、反模式、查询重写。

性能与优化:让查询跑得快

senior 的分水岭——不只写对,还要写得快。

EXPLAIN:看数据库怎么执行

在查询前加 EXPLAIN 看"执行计划",EXPLAIN ANALYZE 还会真跑并报耗时:

EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 1;
  • Seq Scan(全表扫描)vs Index Scan(走索引):数据量大时差距巨大。
  • 在右边练习场里,对任意查询加 EXPLAIN 都能看到真实计划,动手试试。

索引何时有用

高频用于过滤/JOIN 的列适合建索引。但写法不对,索引就用不上(见下)。

常见反模式

  • SELECT *:白读不需要的列。只取所需列。
  • 函数包裹被过滤列(如 EXTRACT(month FROM ts)=2):索引失效。改成范围 ts >= ... AND ts < ...(sargable)。
  • IN + 大子集 / NOT IN + NULL:优先用 EXISTS / NOT EXISTS。
  • 先聚合再过滤无关行:能用 WHERE 提前过滤就别拖到 HAVING。

查询重写

多层嵌套子查询 → CTE (WITH) 或 JOIN,更可读、也常更快。

本模块的题:在结果不变的前提下,把查询改写得更优。

练习(8)

  1. 1.相关子查询改成 JOIN难度 3
  2. 2.用 EXISTS 替代 IN难度 3
  3. 3.列裁剪:别 SELECT *难度 2
  4. 4.去重:DISTINCT难度 2
  5. 5.sargable:别把列包在函数里难度 4
  6. 6.加一个有用的索引难度 3
  7. 7.提前过滤:WHERE 不是 HAVING难度 4
  8. 8.Boss:重写慢查询难度 5