【问题标题】:Multiple column index efficiency多列索引效率
【发布时间】:2013-01-28 08:12:04
【问题描述】:
select a
from t
where b = 1 and c = 2 
  1. 为了提高此查询的性能,我应该创建index (b, c)index(c, b) 还是第一个索引就足够了?
  2. 据我了解,index (b, c, a) 可能会进一步提高性能,但前提是(b, c, a)(b, c) 更独特。那是对的吗?
  3. SQL 问题是否属于 dba.stackexchange 站点?

【问题讨论】:

  • 您使用的是哪个 RDBMS?
  • 如果您要问的话,我正在使用 Oracle。

标签: sql performance oracle indexing


【解决方案1】:
  1. 两列只需要一个索引。两者哪个更好取决于表的结构和将使用它的查询,但通常与复合索引的顺序没有显着差异。

  2. 覆盖查询中使用的所有列的索引称为covering index。它可以提高性能,但除非表有很多列或非常大,否则通常不会产生显着差异。它可以更快的原因是它不必在找到索引中的条目后去数据,它可以只使用索引而不需要查看数据,因为它需要的一切都在索引中。

  3. 有些问题更适合 dba,但这个问题在这里很好。这甚至可能已经迁移到这里,因为它不是很技术性。

对于前两部分,总体思路是“视情况而定”。在您的情况下,由于您可能没有处理大量数据,因此采用哪种方式可能不会产生重大影响;您可能需要一个表中至少 10 MB 的数据才能有明显的差异。

【讨论】:

    【解决方案2】:

    1.为了提高这个查询的性能,我应该创建索引(b,c)和索引(c,b)还是第一个索引足够?

    您不需要创建两个索引。两者中的任何一个,如果用于执行查询,则可以同样提高此类查询的效率(具有where b = 1 and c = 2 条件)。是否使用,是否提高性能,取决于索引的选择性。

    2.据我了解,索引 (b, c, a) 可能会进一步提高性能,但前提是 (b, c, a) 比 (b, c) 更独特。对吗?

    是的。 (b , c, a) 上的索引(或(c, b, a) 上的索引同样好)将提高性能。与选择性无关。读取索引(以及所有从索引中的同一位置)不会比从((b, c) 索引然后从此处的一行和从(可能更宽的)表中的另一行获取a 列数据更糟糕.

    (b, c) 的选择性,例如查询返回多少行,会影响效率提升多少,(b, c, a) 索引会给你。如果查询返回几十行,则差异会很小。如果查询返回数百万表中的数千行,则改进将很高,因为所有数据都将从(覆盖)索引中读取。

    3.SQL问题是否属于dba.stackexchange站点?

    这是元站点的问题,无论是主站点还是 DBA.SE 元站点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-23
      • 2012-07-09
      • 2012-07-09
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      相关资源
      最近更新 更多