为连接建立索引列

时间:2013-03-11 21:54:30

标签: mysql sql performance join indexing

当我们在属性上创建索引时,我们会更快地找到记录,因为索引是树,我们浏览排序顺序的值。
例如。对于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。或者我错了吗?

1 个答案:

答案 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)。

这有帮助吗?