0

当我们在属性上创建索引时,我们会更快地找到记录,因为索引是一棵树,并且我们浏览按排序顺序的值。
例如,SELECT * from branches where name='Washington通过索引,我们将按字典顺序导航以到达日志时间的记录。
但是,当我们在连接中使用的列上建立索引时,这是如何工作的?
例如

SELECT BILLS.NAME NAME, BILLS.AMOUNT AMOUNT FROM BILLS,BANK_ACCOUNTS WHERE BILLS.ACCOUNT_ID = BANK_ACCOUNTS.ACCOUNT_ID  

如果我们创建了一个索引,BILLS(ACCOUNT_ID)那么BANK_ACCOUNTS(ACCOUNT_ID)导航如何更快?我们只是获取每个值BANK_ACCOUNTS.ACCOUNT_ID并使用索引树BILLS来查找匹配的记录?
如果这是它的工作方式,那么为什么人们通常建议在连接中使用的列中创建索引。
在我看来,只创建了 1 个索引,这将用于相等比较器左侧的表,即BILLS. 还是我错了?

4

1 回答 1

0

您提供的示例代码在 BILLS 和 BANK_ACCOUNTS 之间执行 INNER JOIN,因此只会返回 BILLS 中存在于 BANK_ACCOUNTS 中的行。这是在查询运行时通过仅对 BANK_ACCOUNTS 上的非聚集索引执行连接来检查的,因为查询引用的来自 BANK_ACCOUNTS 的所有字段(即 BANK_ACCOUNTS.ACCOUNT_ID)都是索引的一部分,因此“被覆盖” “ 通过它。

在索引中查找 BANK_ACCOUNTS.ACCOUNT_ID 是 O(log N),而每次查找扫描 BANK_ACCOUNTS 是 O(N)。

这有帮助吗?

于 2013-03-11T22:01:31.340 回答