在 MySQL(以及大多数关系型数据库)中,左连接(LEFT JOIN)的索引建立核心原则是:在“被驱动表”的关联字段和“过滤/排序字段”上建索引。
下面按场景说明。
SELECT *
FROM A
LEFT JOIN B ON A.id = B.a_id;
a_id 上建索引(最重要)CREATE INDEX idx_b_aid ON B(a_id);
原因:
a_idSELECT *
FROM A
LEFT JOIN B ON A.id = B.a_id
WHERE B.status = 1;
CREATE INDEX idx_b_aid_status ON B(a_id, status);
说明:
a_id:用于 JOINstatus:用于 WHERE 过滤⚠️ 注意
如果写成:
WHERE A.status = 1;
那应在 A 表建索引:
CREATE INDEX idx_a_status ON A(status);
SELECT *
FROM A
LEFT JOIN B ON A.id = B.a_id
ORDER BY B.created_at;
CREATE INDEX idx_b_aid_created ON B(a_id, created_at);
原因:
a_id JOINcreated_at 排序,避免 filesortA LEFT JOIN B
ON A.x = B.x AND A.y = B.y;
CREATE INDEX idx_b_xy ON B(x, y);
CREATE INDEX idx_a_id ON A(id); -- 对 LEFT JOIN 帮助很小
CREATE INDEX idx_b_status_aid ON B(status, a_id); -- 不利于 JOIN
WHERE B.a_id IS NULL;
仍建议在 B.a_id 建索引。
| 场景 | 建索引位置 | 字段 |
|---|---|---|
| 普通 LEFT JOIN | 被驱动表 | JOIN 字段 |
| JOIN + WHERE | 被驱动表 | (JOIN 字段, 过滤字段) |
| JOIN + ORDER BY | 被驱动表 | (JOIN 字段, 排序字段) |
| 多字段 JOIN | 被驱动表 | 联合索引 |
如果你有具体 SQL 或表结构,我可以直接帮你设计最优索引。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。