答案 0 :(得分:10)
许多(大多数?)DBMS使用索引来支持唯一约束。始终创建索引以强制执行唯一约束;它们(约束)对于正确操作数据库至关重要。
如果您可以选择如何在多个列上创建索引,请将查询中始终引用的列放在其他字段之前 - 通常。如果前导列也有一定的选择性,这是最好的。
在获得唯一性所需的约束之后,请考虑实施参照完整性所需的约束。它们通常也由DBMS强制执行。同样,你不能让你的数据库处于不完整的状态 - 它是一个逻辑系统,如果它包含谬误,你可以从中证明任何东西,这是没有用的。
在处理(索引)唯一性和参照完整性约束之后,您可能会或可能不会从其他人那里获益。仔细选择,并添加尽可能少的额外内容(零是一个很好的数字)。每个索引都会减慢更新操作(UPDATE,INSERT,DELETE)并使用存储空间。目的是通过加快查询来赢得它的位置。但是,不要忘记优化器必须考虑每个索引以及它是否有助于回答查询,因此索引也会降低优化器的速度(尽管您可能很难测量该效果)。
当您添加索引时,将它们添加到选择性列上(不是“性别”包含'M'和'F',但可能'dob'包含1900年到2010年之间的出生日期,或者甚至可能是更明显的值考虑额外的列是否有助于回答更多的查询。一些DBMS(例如DB2)为索引提供了额外的列,这些列不是唯一性约束的一部分,但提供了查询中经常使用的列。这些列可以允许索引 - 只扫描(一个不需要访问表数据,因为所需的值都在索引中)。
还有更多可以说的,但这涵盖了很多领域。
答案 1 :(得分:5)
需要达成平衡。如果您知道将查询一个表并且FieldA将成为where子句的一部分,并且它是一个高度可选的字段(google cardinality),那么它就成为先发制人调整的理想选择。
不要在所有类型的字段上抛出索引,因为你认为它是有道理的,你必须知道这些事情。过早的调整/优化是智者曾经说过的所有邪恶的根源。在这种情况下,索引会损害插入/更新性能,因为不仅需要更新表数据,还需要更新索引。
附注 - 对于某些大型数据加载,人们通常会删除索引,执行加载,然后重新创建索引,以便加载执行速度更快。
就优缺点而言 - 那是一个很大的话题。我建议你从这里开始。
答案 2 :(得分:1)
通常,您在创建表时设置索引。在此阶段,您应该已经很好地指示了如何查询数据,以及哪些字段将最常用作查询条件。
在性能调整期间,通常建议使用明显的索引。在此阶段,您将能够了解是否存在未被有效使用的索引,或者是否存在索引可以提高性能的查询。在性能调优期间,没有什么能阻止您删除或添加新索引。
答案 3 :(得分:1)
我会添加'明显'的索引,即你知道将在表创建时查询的字段,然后根据需要添加其他作为曲调的一部分。最初可以更少地使用较少的索引,然后了解系统的执行和使用方式 - 您的朋友可以听到该配置文件。
优势 - 更快的访问权限(使用索引时),以及强制执行某些业务逻辑的能力,例如无重复项。
缺点 - 表占用更多空间,插入行更慢(可能慢得多),触摸键字段的更新速度较慢