何时应该创建数据库索引?

11
  • 何时为表设置索引,是在创建表时还是在性能调优时设置?
  • 索引的优缺点是什么?

另外:https://dev59.com/bEbRa4cB1Zd3GeqP03sT - OMG Ponies
必读:http://www.sqlskills.com/BLOGS/KIMBERLY/category/The-Tipping-Point.aspx - OMG Ponies
4个回答

16

许多(大多数?)数据库管理系统使用索引来支持唯一约束。始终创建索引以强制执行唯一约束;这些(约束)对于数据库的正确运行至关重要。

在有多个列可以创建索引的选择时,将始终在查询中被引用的列放在其他字段之前 - 通常是最好的选择。如果前导列也比较具有选择性,则效果更佳。

在满足确保唯一性所需的约束之后,请考虑那些需要强制实施引用完整性的约束。它们通常也被DBMS指定。同样,你不能让你的数据库处于不完整状态——它是一个逻辑系统,如果它包含谬误,你可以从中证明任何事情,这是没有帮助的。

在处理(索引)唯一性和引用完整性约束之后,你可能会受益于某些其他约束,也可能没有受益。请仔细选择,并尽量添加尽可能少的额外约束(零是很好的数字)。每个索引都会减慢更新操作(UPDATE、INSERT、DELETE)并占用存储空间。意图是通过加速查询来赢得它的位置。然而,不要忘记优化器必须考虑每个索引以及它是否对回答查询有用,所以索引也会减慢优化器的速度(尽管你可能很难测量到这种影响)。

当你添加索引时,请在选择性列上添加索引(不要使用包含'M'和'F'的'sex',而是使用包含出生日期在1900年至2010年之间的'dob',或者甚至比那更不同的值。考虑额外列是否有助于回答更多的查询。一些DBMS(如DB2)提供了带有额外列的索引,这些列不是唯一性约束的一部分,但提供了在查询中经常使用的列。这些可以允许仅索引扫描(不需要访问表数据,因为所需的值都在索引中)。

还有很多可以说的,但这已经涵盖了很多领域。

  • 尽可能少的索引 - 最好没有额外的。

4
需要平衡。如果你知道一个表将被查询,FieldA将成为where子句的一部分,并且它是一个高度可选择的字段(谷歌基数),那么它是预先调整的好候选。
不要在所有类型的字段上放置索引,因为你认为这是有意义的,必须了解这些事情。过早的调整/优化是万恶之源,一位智者曾经说过。在这种情况下,索引可能会损害插入/更新性能,因为不仅需要更新表数据,还需要更新索引。
附注 - 对于一些大型数据加载,人们经常删除索引,执行加载,然后重新创建索引,以便加载更快。
至于优缺点 - 这是一个巨大的话题。我建议你从这里开始。

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


3

通常在创建表时设置索引。在此阶段,您应该已经很好地了解了如何查询数据以及哪些字段将作为查询条件使用最多。

在性能调整期间,通常建议设置明显的索引。在这个阶段,您将能够了解是否有未有效使用的索引,或者是否有查询可以通过索引提高性能。在性能调整期间,没有任何限制可以删除或添加新的索引。


1

我会添加“显然”的索引,即在创建表时已知将被查询的字段上,然后根据需要添加其他索引作为调整的一部分。最好先少添加索引,然后了解系统的性能和使用情况 - 个人资料是您的朋友。

优点 - 更快的访问(当使用索引时),以及强制执行某些业务逻辑,如无重复。

缺点 - 表占用更多空间,插入行较慢(可能慢得多),触及关键字段的更新较慢。


@MrTelly,你能说一下哪些是“显然”的索引吗? - ACP
就像我说的那样,你知道会被查询的字段以及任何外键字段。 - MrTelly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接