我正在sql server 2005中创建一个索引,与同事的讨论是,它是否在索引键列之间有区别,即id和date vs date然后是id。
在任一场景中创建索引的方式是否存在根本差异?
它会对其他版本的SQL服务器产生影响吗?
由于
答案 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。