我们在许多地方使用了复合索引,它们的工作效果很好。我们的平台具有一个相对复杂的“报告生成器”,它可以根据用户的选择动态地编写查询。我们根据常见查询选择索引,并且我们的复合索引通常与用户想要的内容保持一致。
例如(简化一吨),用户的报告将变成查询:
SELECT
SUM(col1),
SUM(col2)
FROM
someTable
WHERE
colA = "foo"
AND colB = "bar"
AND colC = "baz"
GROUP BY 1, 2;
表将如下所示:
CREATE TABLE someTable (
id PRIMARY KEY,
col1 data_type,
col2 data_type,
colA data_type,
colB data_type,
colC data_type,
INDEX someIndex (colA,colB,colC)
);
我知道MySQL将无法在类似查询的查询上使用该索引:
SELECT
SUM(col1),
SUM(col2)
FROM
someTable
WHERE
colB = "foo"
GROUP BY 1, 2;
我的问题是-MySQL将在查询中使用复合索引吗:
SELECT
SUM(col1),
SUM(col2)
FROM
someTable
WHERE
colA != ""
AND colB = "foo"
GROUP BY 1, 2;
当然,我知道我们可以在colB
上添加索引,但是在这种情况下,这不是一个好选择。我在这里简化了这个问题。实际上,我们在此表中有100列,并且无法在每列上添加索引以及可能的列变化,因此我试图确定是否可以利用我们已经必须使用的内容来加快处理速度这些边缘情况查询。
希望我措辞很好。在此先感谢:)
我的问题是-MySQL将在查询中使用复合索引,例如: ...
不,不会。不等于(!=
)匹配不可索引,因此索引必须以colB开头才能使索引可用。如果将索引从(colA,colB,colC)更改为(colB,colA,colC),则该索引将可用于您提到的第一个查询和您要查询的查询。