一般来说:
1.除非确实需要,否则不要添加索引。
每个索引会使写入速度变慢…
2.将在where子句上使用索引:
-- index on foo (bar)select bar from foo where bar = :bar;
同样,它将用于外键引用(在两个表中)。
-- index on foo (bar) if baz (bar) is frequently updated/deleted.create table foo (bar references baz (bar));
3.索引将用于排序,尤其是在与限制绑定时:
-- index on foo (bar)select bar from foo order by bar limit 10;
4.当同时适用2.和3.时,多列索引有时会很有用。
在这种情况下,将where条件放在首位,将排序键放在最后:
-- index on foo (baz, bar)select bar from foo where baz between :baz1 and :baz2 group by bar;
5.保持表统计信息为最新。
如果表状态是垃圾,那么优化器将很少有机会使用您的索引。如果需要,手动清理/分析数据库。
6.索引的使用取决于您的表分区。
超过一定数量的已检索行阈值后,进行全表扫描会更快。如果您的索引位于一个布尔字段上,该布尔字段或多或少将您的表分成两部分,则永远不会使用它。
同样,如果您的数据存储方式使得索引扫描可能最终会随机访问该表几乎适用的磁盘页面,那么计划者将更喜欢全表扫描。
7.考虑可用的部分/表达式索引。
如果您的字段除10%的行外具有相同的值,请考虑在该字段上使用部分索引(即不包含该值的位置)。这会导致索引变小得多,而不会影响其实际用途。
如果您不断查询应用于列的表达式,并且平台提供了表达式索引,请考虑在其上添加索引。使用该表达式时,不会为每一行求值。


![索引的DO和DONT [关闭] 索引的DO和DONT [关闭]](http://www.mshxw.com/aiimages/31/395315.png)
