首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么时候应该创建数据库索引?

什么时候应该创建数据库索引?
EN

Stack Overflow用户
提问于 2010-01-05 03:38:35
回答 4查看 14.6K关注 0票数 10
  • 何时为表设置索引,在创建表期间还是在性能调优时?
  • 索引的优点和缺点是什么?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-05 04:22:42

很多(大多数?)DBMS使用索引来支持唯一的约束。始终创建索引以强制执行唯一约束;它们(约束)对于数据库的正确操作至关重要。

如果您可以选择如何在多个列上创建索引,则将查询中始终引用的列放在其他字段之前--通常是。如果前面的列也有一定的选择性,这是最好的。

在您有了唯一性所必需的约束之后,请考虑执行引用完整性所需的约束。它们通常也是由DBMS授权的。同样,你不能让你的数据库处于不完整的状态--它是一个逻辑系统,如果它包含谬误,你可以从它证明任何东西,这是没有帮助的。

在处理了唯一性和引用完整性约束(索引)之后,您可能受益于也可能不会受益于其他约束。仔细选择,增加尽可能少的额外(零是一个好的数字)。每个索引减慢更新操作(更新、插入、删除)并使用存储空间。其意图是通过加快查询来赢得自己的位置。但是,不要忘记优化器必须考虑每个索引以及它在回答查询时是否有用,所以索引也会减慢优化器的速度(尽管您可能很难衡量这种效果)。

在添加索引时,将它们添加到选择性列中(不是包含“M”和“F”的“性别”,而是包含1900年至2010年出生日期的“道布”,或者可能比这更明显。考虑额外的列是否有助于回答更多的查询。一些DBMS (如DB2)提供具有额外列的索引,这些列不是唯一性约束的一部分,但提供了查询中经常使用的列。它们允许只进行索引扫描(不需要访问表数据,因为所需的值都在索引中)。

还有很多可以说的,但这涵盖了很多地区。

  • 的索引尽可能少,最好没有额外的索引。
票数 14
EN

Stack Overflow用户

发布于 2010-01-05 03:44:33

有一种平衡需要实现。如果您知道一个表将被查询,FieldA将是where子句的一部分,并且它是一个高度可选的字段(),那么它将成为抢占调优的一个很好的候选。

不要对所有类型的字段进行索引,因为您认为这是有意义的,我们必须知道这些事情。智者曾说过,过早的调整/优化是万恶之源。在这种情况下,索引可能会损害insert/update性能,因为不仅表数据需要更新,而且索引也需要更新。

附带注意-对于一些大的数据负载,人们通常会删除索引,执行加载,然后重新创建索引,以便负载执行得更快。

就利弊而言--这是一个很大的话题。我建议你从这里开始。

http://odetocode.com/articles/70.aspx

票数 4
EN

Stack Overflow用户

发布于 2010-01-05 03:43:38

通常,在创建表期间设置索引。在这个阶段中,您应该已经很好地指示了您的数据将如何被查询,以及哪些字段将作为查询标准使用最多。

在性能调优期间,通常建议设置明显的索引。在此阶段,您将能够了解是否存在没有有效使用的索引,或者是否存在索引可以提高性能的查询。在性能调优期间,没有什么可以阻止您删除或添加新的索引。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2004032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档