首页/数据/SQL 速查/连接驱动顺序与索引配对
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条变更与事务52 条
性能与执行计划72 条

连接驱动顺序与索引配对

连接把“过滤后结果小”的一侧做驱动、另一侧连接列建索引:这是带来数量级差异的结构性因素。

SQL 速查数据更新于 2026-10-12

示例

示例
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 在大结果集等值连接时可能选择哈希连接,此时索引不是硬前提

易错点

  • 给 SELECT 输出的列建索引:连接性能取决于 ON 条件列与 WHERE 过滤列,不是输出列
  • 多表连接只优化一张表:每层连接的被驱动列都要检查,瓶颈可能在后面几层

数据来源与参考

  • MySQL 8.0 Reference Manual · How MySQL Uses Indexes
  • PostgreSQL Documentation §14.1 Using EXPLAIN
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌