索引的DO和DONT

时间:2011-05-23 14:29:20

标签: mysql database performance database-design indexing

使用索引提高数据库性能有哪些DO和DONT?

DO应该是一个应该创建索引的情况,或者是另一个与提示性能相关的索引。

如果不应该创建索引,或者其他与索引相关的操作可能会影响性能,则会出现DONT。

2 个答案:

答案 0 :(得分:30)

一般来说:

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。当3和4都适用时,多列索引偶尔会有用。

在这种情况下,将where条件放在第一位,并将排序键放在最后:

-- index on foo (baz, bar)
select bar from foo where baz between :baz1 and :baz2 group by bar;

5。保持您的表统计数据最新。

如果表统计信息是垃圾,优化程序几乎不可能使用您的索引。如果需要,手动真空/分析您的数据库。

6。索引使用情况取决于您的表格重新分配。

超过检索到的某个行阈值,执行全表扫描会更快。如果您的索引位于一个布尔字段上,该字段或多或少将您的表拆分为两个,则永远不会使用它。

同样,如果您的数据存储方式使索引扫描可能最终随机访问该表的几乎所有适用的磁盘页面,则计划程序将更喜欢全表扫描。

7。在可用时考虑部分/表达式索引。

如果您的某个字段具有相同的值(10%的行除外),请考虑其上的部分索引(即不在该值的位置)。这导致索引小得多而不妨碍其实际用途。

如果您经常查询应用于列的表达式,并且平台提供表达式索引,请考虑在其上添加索引。使用时,不会为每一行计算表达式。

答案 1 :(得分:10)

  1. 整体测量系统吞吐量。索引可以帮助某些查询,但会损害插入,更新和删除。

  2. 创建索引。

  3. 整体测量系统吞吐量。

  4. 如果性能更好,请将索引保留在那里。如果性能更差,请将其删除。