0

我在几个地方读到过,您将任何字段用于将查询结果限制为索引。但是假设您有一个应用程序,其中不同的查询使用不同的列组合。

例如,假设我们有如下三个查询:

  1. Select * from table1 where field1 = 'A';
  2. Select * from table1 where field1 = 'A' and field2 = 'B';
  3. Select * from table1 where field1 = 'A' and field3 = 'C';

为field1创建一个索引,为field2创建一个索引,为field3创建一个索引更好吗?还是为field1创建一个索引,为field1和field2的组合创建一个索引,为field1和field3的组合创建一个索引更好。

4

1 回答 1

3

一个索引field1将有助于所有三个查询。(field1, field2)一个或两个上的复合索引(field1, field3)将有助于第一个查询以及第二个或第三个查询 - 并在冗余上呈现非唯一索引field1(因为复合索引可以与第一个查询一起使用)。

对于任何给定的索引,您必须权衡添加索引的成本与拥有索引的好处。索引使用空间;添加、删除或更新行时(通常),索引使用处理时间。如果您要经常使用索引并且在使用时提供足够的加速,那么收益将超过成本。如果您很少使用该指数,它可能无法收回成本。如果表是动态的(行频繁更改),则索引的更新成本大于表相对静态(很少更改)的情况。

尽管当有更多索引时优化器必须更加努力(检查哪些是相关的),但它很少是决定创建或不创建索引的决定因素。

通常,请确保您拥有与表相关的所有唯一索引。

如果您确信(因为您已经测量过)复合索引会以足够大的幅度加快处理速度,并且会经常使用,从而为您带来整体收益,请添加复合索引。

于 2013-06-07T05:23:44.580 回答