“自连接(Self Join)”本质上还是同一张表的连接,只是把表当两张表用。索引怎么建,核心取决于连接条件和过滤条件。下面按场景说明“最好”的建法。
常见结构(如组织架构、评论回复):
employees(
id,
manager_id,
name,
dept_id,
status
)
自连接 SQL 通常是:
SELECT e.name, m.name
FROM employees e
JOIN employees m
ON e.manager_id = m.id;
CREATE INDEX idx_emp_manager ON employees(manager_id);
-- 或(如果常查整行)
CREATE INDEX idx_emp_manager_id ON employees(manager_id, id);
原因
e.manager_id = m.idemployees m
→ e 侧需要按 manager_id 快速定位SELECT e.name, m.name
FROM employees e
JOIN employees m
ON e.manager_id = m.id
WHERE e.dept_id = 10
AND e.status = 'ACTIVE';
CREATE INDEX idx_emp_dept_status_manager
ON employees(dept_id, status, manager_id);
原因
dept_id + statusmanager_id 做连接例如:
a.id = b.parent_id
-- 或
a.parent_id = b.id
✅ 建议同时考虑:
CREATE INDEX idx_parent ON table(parent_id);
CREATE INDEX idx_id ON table(id); -- 主键通常已有
一般来说:
id:主键索引(已有)parent_id:必须建❌ 错误:
ON DATE(e.create_time) = m.create_time
✅ 正确:
ON e.create_time = m.create_time
CREATE INDEX idx_cover
ON employees(manager_id, name);
适合:
SELECT e.name
FROM employees e
JOIN employees m ON e.manager_id = m.id;
✅ 自连接索引 = 普通连接索引
✅ 索引建在 被驱动表的连接列
✅ 连接列 + 过滤列组合索引最好
✅ 大表一定建,小表可不建
如果你愿意,可以把具体 SQL + 表结构 + 数据量级发我,我可以直接帮你设计“最优索引方案”。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。