索引的DO和DONT

Cli*_*ote 12 mysql database indexing performance database-design

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

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

如果不应创建索引,或者可能损害性能的其他索引相关操作,则表示DONT.

Den*_*rdy 30

一般来说:

1.除非您确实需要,否则不要添加索引.

每个索引使写入速度变慢......

2.索引将用于where子句:

-- index on foo (bar)
select bar from foo where bar = :bar;
Run Code Online (Sandbox Code Playgroud)

同样,它将用于外键引用(在两个表上).

-- index on foo (bar) if baz (bar) is frequently updated/deleted.
create table foo (bar references baz (bar)); 
Run Code Online (Sandbox Code Playgroud)

3.索引将用于排序,尤其是当绑定到限制时:

-- index on foo (bar)
select bar from foo order by bar limit 10;
Run Code Online (Sandbox Code Playgroud)

4.当适用3和4时,多列索引偶尔会有用.

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

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

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

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

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

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

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

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

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

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


S.L*_*ott 10

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

  2. 创建索引.

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

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