如何知道何时使用索引和哪种类型?

时间:2010-03-09 21:27:39

标签: sql performance database-design indexing

我搜索了一下,没有看到任何类似的问题,所以就这样了。

您如何知道何时在表中放置索引?您如何确定索引中包含哪些列?应该何时使用聚集索引?

索引是否会降低select语句的性能?有多少索引太多,你需要多大的表才能从索引中受益?

编辑:

列数据类型怎么样?是否可以在varchardatetime

上建立索引

6 个答案:

答案 0 :(得分:3)

嗯,第一个问题很简单:

  

什么时候应该使用聚集索引?

始终。期。除了极少数罕见的边缘情况。对于每个操作,聚簇索引使表更快。是!确实如此。有关背景信息,请参阅Kim Tripp的优秀The Clustered Index Debate continues。她还提到了她对聚集索引的主要标准:

  • 静态(永不改变)
  • 独特
  • 如果可能的话:不断增加

INT IDENTITY完美地实现了这一点 - GUID没有。有关详细背景信息,请参阅GUID's as Primary Key

为什么要缩小?因为聚簇键被添加到同一个表中每个非聚集索引的每个索引页面上(为了能够实际查找数据行) , 如果需要的话)。您不希望在群集密钥中使用VARCHAR(200)....

为什么是唯一的?参见上文 - 群集密钥是SQL Server用于唯一查找数据行的项和机制。它必须是独一无二的。如果您选择一个非唯一的群集键,SQL Server本身将为您的键添加一个4字节的唯一键。小心一点!

下一篇:非聚集索引。基本上有一条规则:引用另一个表的子表中的任何外键都应该被索引,它将加速JOIN和其他操作。

此外,任何具有WHERE子句的查询都是一个很好的选择 - 首先选择那些执行很多的子句。将索引放在ORDER BY语句中显示在WHERE子句中的列上。

下一步:测量您的系统,检查DMV(动态管理视图)以获取有关未使用或缺失索引的提示,并反复调整您的系统。这是一个持续的过程,你永远不会完成!请参阅here for info关于这两个DMV(缺失和未使用的索引)。

另一个警告:使用大量索引,您可以使任何SELECT查询真的非常快。但与此同时,必须更新所有相关索引的INSERT,UPDATE和DELETE可能会受到影响。如果你只选择SELECT - 坚果!否则,这是一个精细而微妙的平衡行为。您可以随时调整单个查询 - 但系统的其余部分可能会受此影响。不要过度索引您的数据库!放置一些好的索引,检查并观察系统的行为,然后再添加一个或两个,再次:观察整体系统性能如何受此影响。

答案 1 :(得分:1)

经验法则是主键(隐含和默认为群集)和每个外键列

还有更多,但你可能比使用SQL Server的missing index DMV

更糟糕

如果优化器做出错误的选择,索引可能会降低SELECT的速度,并且可能有太多。太多会减慢写入速度,但也可能重叠索引

答案 2 :(得分:1)

我可以说答案我会说每个表格,无论多小,都会从至少一个索引中获益,因为至少有一种方法可以让你对查询数据感兴趣;否则为什么存储呢?

添加索引的一般规则是,如果需要使用特定字段或字段集查找表中的数据。这会导致有多少索引太多,通常,插入和更新速度越慢的索引就越多,因为它们也必须修改索引,但这一切都取决于您使用数据的方式。如果您需要快速插入,请不要使用太多。在报告“只读”类型数据存储时,您可以使用其中的一些来更快地进行所有查找。

不幸的是,没有一条规则可以引导您使用索引的数量或类型,尽管您选择的数据库的查询优化器可以根据您正在执行的查询给出提示。

对于聚集索引,它们是您只能使用一次的Ace卡,因此请谨慎选择。值得计算你想要放置它的字段的选择性,因为它可能被浪费在像布尔字段(设想的例子)这样的东西上,因为数据的选择性非常低。

答案 3 :(得分:0)

这实际上是一个非常复杂的问题,尽管一个好的起点是索引任何要过滤结果的列。即。如果您经常按销售价格将产品分组,请将产品表的sale_price列编入索引,以改善该查询的扫描时间等。

答案 4 :(得分:0)

如果您根据列中的值进行查询,则可能需要索引该列。

SELECT a,b,c FROM MyTable WHERE x = 1

您需要X上的索引。

通常,我为经常查询的列添加索引,并在我查询多个列时添加复合索引。

索引不会损害SELECT的性能,但如果每个表的索引列数太多,它们可能会减慢INSERTS(或UPDATES)的速度。

根据经验 - 当您发现自己说WHERE a = 123(在这种情况下,是“a”的索引)时,首先添加索引。

答案 5 :(得分:0)

您应该对用于选择和排序的列使用索引 - 即WHERE和ORDER BY子句。

索引可以减慢select语句的速度,如果有很多语句,并且您在未编制索引的列上使用WHERE和ORDER BY。

至于表的大小 - 数千行及以上将开始显示索引使用的真正好处。

话虽如此,有一些自动化工具可以做到这一点,SQL服务器有一个Database Tuning Advisor可以帮助解决这个问题。