select a
from t
where b = 1 and c = 2
- 为了提高此查询的性能,我应该创建第一个索引
index (b, c)
还是index(c, b)
足够? - 据我了解,
index (b, c, a)
可能会进一步提高性能,但前提(b, c, a)
是 MORE 比(b, c)
. 那是对的吗? - SQL 问题是否属于 dba.stackexchange 站点?
select a
from t
where b = 1 and c = 2
index (b, c)
还是index(c, b)
足够?index (b, c, a)
可能会进一步提高性能,但前提(b, c, a)
是 MORE 比(b, c)
. 那是对的吗?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 元站点。
您只需要在两列上都有一个索引。两者哪个更好取决于表的结构和将使用它的查询,但通常与复合索引的顺序没有显着差异。
覆盖查询中使用的所有列的索引称为covering index
. 它可以提高性能,但除非表有很多列或非常大,否则通常不会产生显着差异。它可以更快的原因是它不必在找到索引中的条目后访问数据,它可以只使用索引而不需要查看数据,因为它需要的一切都在索引中。
有些问题更适合 dba,但这个问题在这里很好。这甚至可能已经迁移到这里,因为它不是非常技术性的。
对于前两部分,总体思路是“视情况而定”。在您的情况下,由于您可能没有处理大量数据,因此走哪条路可能不会产生重大影响;您可能需要在表中至少有 10 MB 的数据才能有明显的差异。