sql - JOIN 子句的适当索引
问题描述
假设我有以下具有给定属性的表:
表A:A_ID、B_NUM、C、D 表B:B_ID、E、F
有以下查询:
SELECT TableA.*,TableB.E,TableB.F FROM TableA
INNER JOIN TableB ON TableA.B_NUM=TableB.B_ID
什么索引会使这个查询受益?
我很难理解这个主题,我应该在哪里创建什么索引。
谢谢!
解决方案
这个查询:
SELECT a.*, b.E, b.F
FROM TableA a INNER JOIN
TableB b
ON a.B_NUM = b.B_ID;
正在返回两个表之间匹配的所有数据。
对没有WHERE
或GROUP BY
在用于连接的列上添加索引的查询进行索引的一般建议。我会走得更远一点。
我对最佳索引的第一个猜测是 on TableB(b_id, e, f)
。这是一个覆盖指数TableB
。这意味着 SQL 引擎可以使用索引来获取e
和f
. 它不需要转到数据页。索引更大,但不需要数据页。(在大多数数据库中都是如此;有时行锁定的考虑会使事情变得更复杂一些。)
另一方面,如果TableA
它真的很大而且TableB
小得多,因此 in 中的大多数行都TableA
没有匹配TableB
,那么索引 onTableA(B_NUM)
将是更好的索引。
您可以包含两个索引并让优化器决定使用哪个(优化器可能会决定同时使用这两个索引,但我认为这不太可能)。
推荐阅读
- ajax - WordPress + 管理面板 + 插件页面 + AJAX = 400 错误请求
- ruby-on-rails - 如何在 Firebase Ruby REST 包装器中获取推送值键
- android - 如何将 API 级别添加到 NDK?
- java - Base64在android中解码一个正常的未编码字符串不会给出任何异常
- mongodb - mongodb $or 总是返回 false (const)
- arrays - 如何在布尔条件下过滤javascript中的数组数据?
- ios - Swift - 作为 ChildViewController 的 UITabBarController 不起作用
- mysql - 在表中动态添加多列而不在sql中使用alter命令
- java - 使用 openjdk 11 构建 Gradle 失败
- python - 龙卷风 write_message 不发送 dict/json