是否有以下两个指标之间的差异?
- IDX_IndexTables_1
- IDX_IndexTables_2
如果有的话,有什么区别?
create table IndexTables (
id int identity(1, 1) primary key,
val1 nvarchar(100),
val2 nvarchar(100),
)
create index IDX_IndexTables_1 on IndexTables (val1, val2)
GO
create index IDX_IndexTables_2 on IndexTables (val2, val1)
GO
是。 它们是有区别的。
综合指数IDX_IndexTables_1
可用于其中的任何查询val1
列where子句中使用。
综合指数IDX_IndexTables_2
可用于其中的任何查询val2
列被where子句中使用。
所以,例如IDX_IndexTables_2
不能使用此查询(但IDX_IndexTables_1可以使用):
SELECT val1, val2 FROM IndexTables
WHERE val1 = some_value
但也可以使用此查询:
SELECT val1, val2 FROM IndexTables
WHERE val2 = some_value AND val1 = some_other-value
想想一个综合指数的方法是想想纸质电话簿; 它是由姓列索引,然后将名字列:您可以自行查找按姓氏而不是姓。
多列索引是比服用的所有列的字段和concatinating在一起概念性没有不同 - 索引结果作为单个字段。
由于索引是B树他们总是找遍从左到右。 你必须开始从左边的搜索,你向右移动,换做其工作,并提供有用的结果指数配对下来的结果。
由于只有一个字段建立索引:
WHERE val1 LIKE 'myvalue%' (uses index)
WHERE val1 LIKE '%myvalue' (cannot use index)
同样的概念被应用于多列索引:
当订单VAL1,VAL2
WHERE val1='value1' (uses index)
WHERE val2='value2' (cannot use index)
当订单值2,VAL1
WHERE val1='value1' (cannot use index)
WHERE val2='value2' (uses index)
如果这两个字段都精确匹配索引的顺序在这种情况下并不重要。
WHERE val1='value1' AND val2='value2' (uses index in any order)
你有什么是一个综合指数。 当你的WHERE子句不使用复合索引中的所有列的顺序很重要。
考虑此查询:
SELECT val1
FROM IndexTables
WHERE val1 = 'MyValue'
为了知道会考虑哪些指标由左边读到你的综合指数到右列。 如果列没有在您的查询存在你读都在你的查询,则该索引将不会被使用的列前。
IDX_IndexTables_1
(VAL1,VAL2):从左至右VAL1阅读存在,这是我们所以这个指标将被视为仅列
IDX_IndexTables_2
(VAL2,VAL1):从左至右VAL2阅读并不在此查询存在,所以它不会被使用。
以前的答案描述了如何使用每个索引的第一列。 (在where子句)。
我认为这是同样重要的是指出,第二列是有用的,因为它可能会增加,涉及的第二列的查询性能。
下面的查询将仅使用索引查找上IDX_1,节省了宝贵的查找到基表(因为VAL2已经是该指数的一部分)完成。
SELECT val2 from IndexTables where val1 = @someVal1
同样,反向指数将优化这个查询:
SELECT val1 from IndexTables where val2 = @someVal2
但是,只有一个(这并不重要),这两个指标是需要优化以下查询:
SELECT val1, val2 from IndexTables where val1 = @someVal1 and val2 = @someVal2
这表明,这取决于你的表收到的查询,有可能是一个正当的理由有两个指标。