【问题标题】:Database indexes and combinations数据库索引和组合
【发布时间】:2013-06-07 05:15:02
【问题描述】:

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

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

  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的组合创建一个索引更好。

【问题讨论】:

    标签: database indexing


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-06-07
      • 2010-10-24
      • 2023-01-13
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 2015-06-14
      • 2011-02-27
      • 1970-01-01
      相关资源
      最近更新 更多