发布于 2010-01-05 04:22:42
很多(大多数?)DBMS使用索引来支持唯一的约束。始终创建索引以强制执行唯一约束;它们(约束)对于数据库的正确操作至关重要。
如果您可以选择如何在多个列上创建索引,则将查询中始终引用的列放在其他字段之前--通常是。如果前面的列也有一定的选择性,这是最好的。
在您有了唯一性所必需的约束之后,请考虑执行引用完整性所需的约束。它们通常也是由DBMS授权的。同样,你不能让你的数据库处于不完整的状态--它是一个逻辑系统,如果它包含谬误,你可以从它证明任何东西,这是没有帮助的。
在处理了唯一性和引用完整性约束(索引)之后,您可能受益于也可能不会受益于其他约束。仔细选择,增加尽可能少的额外(零是一个好的数字)。每个索引减慢更新操作(更新、插入、删除)并使用存储空间。其意图是通过加快查询来赢得自己的位置。但是,不要忘记优化器必须考虑每个索引以及它在回答查询时是否有用,所以索引也会减慢优化器的速度(尽管您可能很难衡量这种效果)。
在添加索引时,将它们添加到选择性列中(不是包含“M”和“F”的“性别”,而是包含1900年至2010年出生日期的“道布”,或者可能比这更明显。考虑额外的列是否有助于回答更多的查询。一些DBMS (如DB2)提供具有额外列的索引,这些列不是唯一性约束的一部分,但提供了查询中经常使用的列。它们允许只进行索引扫描(不需要访问表数据,因为所需的值都在索引中)。
还有很多可以说的,但这涵盖了很多地区。
发布于 2010-01-05 03:44:33
有一种平衡需要实现。如果您知道一个表将被查询,FieldA将是where子句的一部分,并且它是一个高度可选的字段(),那么它将成为抢占调优的一个很好的候选。
不要对所有类型的字段进行索引,因为您认为这是有意义的,我们必须知道这些事情。智者曾说过,过早的调整/优化是万恶之源。在这种情况下,索引可能会损害insert/update性能,因为不仅表数据需要更新,而且索引也需要更新。
附带注意-对于一些大的数据负载,人们通常会删除索引,执行加载,然后重新创建索引,以便负载执行得更快。
就利弊而言--这是一个很大的话题。我建议你从这里开始。
http://odetocode.com/articles/70.aspx
发布于 2010-01-05 03:43:38
通常,在创建表期间设置索引。在这个阶段中,您应该已经很好地指示了您的数据将如何被查询,以及哪些字段将作为查询标准使用最多。
在性能调优期间,通常建议设置明显的索引。在此阶段,您将能够了解是否存在没有有效使用的索引,或者是否存在索引可以提高性能的查询。在性能调优期间,没有什么可以阻止您删除或添加新的索引。
https://stackoverflow.com/questions/2004032
复制相似问题