[ PROMPT_NODE_25130 ]
query-missing-indexes
[ SKILL_DOCUMENTATION ]
## 在 WHERE 和 JOIN 列上添加索引
在未索引的列上进行过滤或连接会导致全表扫描,随着表数据量的增长,性能会呈指数级下降。
**错误做法(大表上的顺序扫描):**
sql
-- customer_id 上没有索引导致全表扫描
select * from orders where customer_id = 123;
-- EXPLAIN 显示: Seq Scan on orders (cost=0.00..25000.00 rows=100 width=85)
**正确做法(索引扫描):**
sql
-- 在频繁过滤的列上创建索引
create index orders_customer_id_idx on orders (customer_id);
select * from orders where customer_id = 123;
-- EXPLAIN 显示: Index Scan using orders_customer_id_idx (cost=0.42..8.44 rows=100 width=85)
对于 JOIN 列,始终在外部键(Foreign Key)侧建立索引:
sql
-- 在引用列上建立索引
create index orders_customer_id_idx on orders (customer_id);
select c.name, o.total
from customers c
join orders o on o.customer_id = c.id;
参考:[查询优化 (Query Optimization)](https://supabase.com/docs/guides/database/query-optimization)