mysql - MySQL 是否可以使用复合索引,其中一个字段是 WHERE 字段 > 0?

标签 mysql database indexing query-optimization composite-index

我们在很多地方都使用了复合索引,而且效果很好。我们的平台有一个相对复杂的“报告生成器”,它根据用户的选择动态编写查询。我们选择基于常见查询的索引,而且我们的复合索引通常与用户想要的非常吻合。

例如(简化一吨),用户的报告将变成查询:

SELECT
  colA,
  colB,
  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
  colA,
  colB,
  SUM(col1),
  SUM(col2)
FROM
  someTable
WHERE
  colB = "foo"
GROUP BY 1, 2;

我的问题是 - MySQL 是否将复合索引用于如下查询:
SELECT
  colA,
  colB,
  SUM(col1),
  SUM(col2)
FROM
  someTable
WHERE
  colA != ""
  AND colB = "foo"
GROUP BY 1, 2;

我当然知道,我们可以在 colB 上添加一个索引。 ,但在这种情况下这不是一个好的选择。我在这里进行了简化以使问题清晰。实际上,我们在这个表中有 100 列,并且无法在每列上添加索引和可能的列变化,所以我试图弄清楚我们是否可以利用我们已经拥有的东西来加快速度那些边缘情况查询。

希望我说得好。提前致谢 :)

最佳答案

My question is - will MySQL use the composite index with a query like: ...



不,不会。不等于 ( != ) 匹配不可索引,因此索引必须以 colB 开头才能使索引可用。如果您将索引从 (colA, colB, colC) 更改为 (colB, colA, colC),则该索引将可用于您提到的第一个查询和您询问的查询。

关于mysql - MySQL 是否可以使用复合索引,其中一个字段是 WHERE 字段 > 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62249322/

相关文章:

java - 级联删除在更大数据集上的性能下降,这可能是由于缺乏索引造成的吗?

mysql - 如何在 MySQL 中存储 URL

php - MySQL查询中间表

php - 简单博客脚本 - 重定向到具有给定内容的页面

sql - 在 Postgresql 中一次只查询 2 列的索引 3 列的最佳选择

oracle - 如何优化从具有数百万行的多个表中进行选择

php文件解析错误

mysql - 无法处理带有特殊字符的代码

SQL Server - 组行

mysql - 大表 (> 1M) 上 MySQL 查询的最佳键