2
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)是 MORE 比(b, c). 那是对的吗?
  3. SQL 问题是否属于 dba.stackexchange 站点?
4

2 回答 2

3

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 元站点。

于 2013-02-12T22:15:29.180 回答
2
  1. 您只需要在两列上都有一个索引。两者哪个更好取决于表的结构和将使用它的查询,但通常与复合索引的顺序没有显着差异。

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

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

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

于 2013-02-12T21:50:41.277 回答