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

ACP*_*ACP 8 sql indexing sql-server-2005

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

Jon*_*ler 10

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

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

在获得唯一性所需的约束之后,请考虑实施参照完整性所需的约束.它们通常也由DBMS强制执行.同样,你不能让你的数据库处于不完整的状态 - 它是一个逻辑系统,如果它包含谬误,你可以从中证明任何东西,这是没有用的.

在处理(索引)唯一性和参照完整性约束之后,您可能会或可能不会从其他一些人那里获益.仔细选择,并添加尽可能少的额外内容(零是一个很好的数字).每个索引都会减慢更新操作(UPDATE,INSERT,DELETE)并使用存储空间.目的是通过加快查询来赢得它的位置.但是,不要忘记优化器必须考虑每个索引以及它是否有助于回答查询,因此索引也会降低优化器的速度(尽管您可能很难测量该效果).

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

还有更多可以说的,但这涵盖了很多领域.

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


kei*_*en7 5

需要达成平衡.如果您知道将查询一个表并且FieldA将成为where子句的一部分,并且它是一个高度可选的字段(谷歌基数),那么它就成为先发制人调整的良好候选者.

不要在所有类型的字段上抛出索引,因为你认为它是有意义的,必须知道这些事情.过早的调整/优化是智者曾经说过的所有邪恶的根源.在这种情况下,索引会损害插入/更新性能,因为不仅需要更新表数据,还需要更新索引.

附注 - 对于某些大型数据加载,人们通常会删除索引,执行加载,然后重新创建索引,以便加载执行速度更快.

至于优缺点 - 那是一个很大的话题.我建议你从这里开始.

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