当我们在属性上创建索引时,我们会更快地找到记录,因为索引是树,我们浏览排序顺序的值。
例如。对于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
的索引树来查找匹配的记录?
如果这是它的工作方式,那么为什么人们通常建议在连接中使用的列中创建索引
在我看来,只创建了一个索引,并且该索引将用于等式比较器左侧的表,即BILLS
。或者我错了吗?
答案 0 :(得分:0)
您提供的示例代码在BILLS和BANK_ACCOUNTS之间执行INNER JOIN,因此只返回BANK_ACCOUNTS中存在的BILLS行。通过仅对BANK_ACCOUNTS上的非聚集索引执行连接,在查询运行时检查这一点,因为查询引用的BANK_ACCOUNTS中的所有字段(即BANK_ACCOUNTS.ACCOUNT_ID)都是索引的一部分,因此“覆盖” “ 通过它。
在索引中查看BANK_ACCOUNTS.ACCOUNT_ID是O(log N),而每次查找的扫描BANK_ACCOUNTS将是O(N)。
这有帮助吗?