示例
示例
ALTER TABLE orders ADD INDEX idx_user_id (user_id);
-- users 为小表(过滤后行数少)、orders 为大表
SELECT u.name, o.total
FROM users u
JOIN orders o ON o.user_id = u.id
WHERE u.city = 'shanghai';
-- 用 EXPLAIN 验证:users 是否作为驱动、orders 是否走 idx_user_id
EXPLAIN SELECT u.name, o.total
FROM users u
JOIN orders o ON o.user_id = u.id
WHERE u.city = 'shanghai';| 原则 | 驱动侧结果集越小越好;被驱动侧连接列要有可用索引 |
|---|---|
| 多表连接 | 逐级裁剪:每增加一表,都要保证被驱动列有索引 |
| 哈希连接 | 8.0.18+ 与 PG 在大结果集等值连接时可能选择哈希连接,此时索引不是硬前提 |