乡亲
我是DB设计的新手。我想知道设计的不同之处和性能差异
提前谢谢你。
发布于 2012-07-14 07:10:25
拥有许多索引要求Server维护和更新每个insert、delete或update语句的多个索引。因此,指数较少通常更好。
但是,当您有一个复合索引(由多个列组成)时,只有在使用/指定查询中的n个左列时,这才有帮助。
因此,如果对一个地址表有一个索引on (City, LastName, FirstName),则该索引可以在
WHERE子句中有所有三列WHERE City = 'London' (使用最左边的1列)WHERE City = 'London' and LastName = 'Smith' (使用最左边的2列)然而,这种索引永远不能用于:
WHERE FirstName = 'Joe'子句的所有行--在该索引中没有使用n个最左边的列WHERE LastName = 'Brown' AND FirstName = 'Charlie'子句的所有行--再说一次:在该索引中没有使用n个最左边的列复合索引(在许多情况下)不能替换所有的单列索引。在设计和创建复合索引时要非常小心,以确保设计它们的方式非常有用!
因此,尽管复合指数确实有其存在的理由,而且它们通常更可取--你也需要确保它们真的能够被使用。正在维护的索引(并导致Server方面的工作),但永远不能在任何查询中使用的索引,是有史以来最糟糕的索引--没有增益,只有维护开销。
您还应该阅读“索引女王”金伯利·特里普关于Server索引的优秀博客文章--最著名的是索引:仅仅因为你可以,并不意味着你应该!
发布于 2012-07-14 06:19:16
那得看情况。如果大多数查询只使用where子句或on join子句中的一个列。然后,当where子句中有一个组合列时,单列nc索引应该是fine.But,然后使用组合索引应该是首选的。
您可以创建999个NC索引。另外,您可以在索引中使用covering.But子句来使更多的索引生成更多的索引,请注意,创建未完成的索引可能会减慢您的DML操作,并会导致表和索引的大小增加。
https://dba.stackexchange.com/questions/20904
复制相似问题