select a
from t
where b = 1 and c = 2
index (b, c)
和index(c, b)
还是第一个索引足够?index (b, c, a)
可能会进一步提高效果,但前提是(b, c, a)
比(b, c)
更独特。那是对的吗? 答案 0 :(得分: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元。
答案 1 :(得分:2)
两列上只需要一个索引。哪两个更好取决于表的结构和将使用它的查询,但通常与复合索引的顺序没有显着差异。
包含查询中使用的所有列的索引称为covering index
。它可以提高性能,但除非表格有很多列或非常大,否则它通常不会产生显着差异。它可以更快的原因是,它不是必须在索引中找到条目后转到数据,它可以只使用索引而不需要查看数据,因为它需要的所有内容都在索引中。
有些问题更适合dba,但这个问题在这里很好。这可能甚至已经迁移到这里,因为它不是很技术性。
对于前两部分,一般的想法是“它取决于”。在您的情况下,由于您可能没有处理大量数据,因此可能不会产生显着差异。你可能需要在表格中至少有10 MB的数据才能产生明显的差异。