2013-03-11 31 views
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。或者我错了?

+2

你应该阅读[all of this](http://use-the-index-luke.com/) - 尤其是* Join Operation *部分。 – 2013-03-11 21:58:49

回答

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

这有帮助吗?

+0

不确定。“仅对BANK_ACCOUNTS'上的非聚集索引执行连接这意味着它会忽略该表并仅在索引上进行连接? – Cratylus 2013-03-11 22:13:09

+0

@Cratylus:是的,这就是“覆盖”查询的索引。也就是说,当读取索引记录提供查询的所有必需字段时,引擎知道不会浪费周期读取聚集索引中的完整记录。 – 2013-03-11 23:09:54