温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

左连接索引如何建立

发布时间:2026-11-02 14:45:53 来源:亿速云 阅读:101 作者:小樊 栏目:数据库

在 MySQL(以及大多数关系型数据库)中,左连接(LEFT JOIN)的索引建立核心原则是:在“被驱动表”的关联字段和“过滤/排序字段”上建索引。

下面按场景说明。


一、基本 LEFT JOIN 示例

SELECT *
FROM A
LEFT JOIN B ON A.id = B.a_id;

✅ 索引建议

  • B 表:在 a_id 上建索引(最重要)
CREATE INDEX idx_b_aid ON B(a_id);

原因:

  • LEFT JOIN 时,A 是驱动表,B 是被驱动表
  • 数据库会拿 A.id 去 B 中查找 a_id
  • 有索引可避免 B 全表扫描

二、带 WHERE 条件的 LEFT JOIN

SELECT *
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:用于 JOIN
  • status:用于 WHERE 过滤
  • 联合索引顺序:JOIN 字段在前,过滤字段在后

⚠️ 注意
如果写成:

WHERE A.status = 1;

那应在 A 表建索引:

CREATE INDEX idx_a_status ON A(status);

三、带 ORDER BY / GROUP BY

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 JOIN
  • 再按 created_at 排序,避免 filesort

四、多字段 LEFT JOIN

A LEFT JOIN B
ON A.x = B.x AND A.y = B.y;

✅ 推荐索引

CREATE INDEX idx_b_xy ON B(x, y);

五、常见错误 ❌

❌ 在驱动表(A)的 JOIN 字段建索引没用

CREATE INDEX idx_a_id ON A(id); -- 对 LEFT JOIN 帮助很小

❌ 索引字段顺序反了

CREATE INDEX idx_b_status_aid ON B(status, a_id); -- 不利于 JOIN

❌ 对 NULL 值过滤误解

WHERE B.a_id IS NULL;

仍建议在 B.a_id 建索引。


六、快速总结 ✅

场景 建索引位置 字段
普通 LEFT JOIN 被驱动表 JOIN 字段
JOIN + WHERE 被驱动表 (JOIN 字段, 过滤字段)
JOIN + ORDER BY 被驱动表 (JOIN 字段, 排序字段)
多字段 JOIN 被驱动表 联合索引

如果你有具体 SQL 或表结构,我可以直接帮你设计最优索引。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手