sql server中的id,date或date,id索引之间是否有区别?

时间:2009-05-06 17:16:24

标签: sql-server indexing

我正在sql server 2005中创建一个索引,与同事的讨论是,它是否在索引键列之间有区别,即id和date vs date然后是id。

在任一场景中创建索引的方式是否存在根本差异?

它会对其他版本的SQL服务器产生影响吗?

由于

3 个答案:

答案 0 :(得分:8)

是的,当然。有没有人查询表JUST日期或JUST id?日期索引,id可用于查找日期,但不仅仅是id,反之亦然

使用日期,ID:

Jan 1     4  
Jan 1     7  
Jan 2     6  
Jan 2     9  
Jan 2     33  
Jan 3     23  
Jan 4     1

使用id,日期:

1     Jan 4  
4     Jan 1  
6     Jan 2  
7     Jan 1  
9     Jan 2  
23    Jan 3  
33    Jan 2 

如果查询中的WHERE子句或JOIN同时使用date和id,那么任何一个索引都可以。但你可以看到,如果你只按日期进行查找,第一个索引对此有用,但第二个索引是完全随机的。

从更一般的意义上讲,A,B,C,D的索引对A,B,C,D,或A,B,C或A,B或A的查询都有用。< / p>

答案 1 :(得分:3)

当涉及到索引时,列的顺序很重要。在你的情况下它是否重要取决于。

让我解释一下。

假设您有一个人员表,包括名字,姓氏和中间名。

因此,您可以按以下顺序创建此索引:

FirstName, MiddleName, LastName

现在,假设您现在使用所有这些列上的WHERE进行查询。它将使用整个索引。

但是,假设您只查询名字和姓氏,现在发生的是,虽然它仍将使用查询,但它将获取与WHERE子句具有相同名字的索引的范围,然后扫描那些,检索具有匹配姓氏的那些。请注意,它将扫描具有相同名字的所有行。

但是,如果你重新安排了索引,就像这样:

FirstName, LastName, MiddleName

然后上面的查询将获取具有相同名字和姓氏的索引的范围,并检索它们。

如果你以另一种方式看待它,会更容易掌握。

电话簿按姓氏排序,然后是姓名和中间名。如果你把中间名放在名字和姓氏之间并进行排序,那么具有相同名字和姓氏的人似乎就会到处都是,只是因为你在名字前排序了中间名。

因此,如果您正在寻找我的名字,即“LasseVågsætherKarlsen”,您会找到所有Karlsen人,我们将位于电话簿的连续列表中,但我的名字将是似乎随机放置,只是因为列表将由Vågsæther排序。

因此,即使查询不使用索引中的所有列,也可以使用索引,但只要列在索引的前面列出,快速查找功能才起作用。跳过列后,会进行某种扫描。

现在,如果您的所有查询都同时使用id和日期,那么无关紧要,但是如果所有查询都包含日期,并且只有部分查询包含id,那么我会将日期放在第一位,然后是id这样,索引将在更多情况下使用。

答案 2 :(得分:0)

是的,这很重要。假设您在列(A,B)上创建索引。您可以使用包含两列的WHERE子句执行SELECT,并且可以使用索引。如果使用仅包含A列的WHERE执行SELECT,也将使用该索引。但是如果使用仅包含B列的WHERE执行SELECT,则无法使用索引

有关详细信息,请参阅here