返回路线图
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,更可读、也常更快。
本模块的题:在结果不变的前提下,把查询改写得更优。