mysql - MySQL 可以使用其中一个字段是 WHERE 字段 > 0 的复合索引吗?
问题描述
我们在很多地方都使用复合索引,而且效果很好。我们的平台有一个相对复杂的“报告生成器”,它可以根据用户的选择动态编写查询。我们根据常见查询选择索引,并且我们的复合索引通常与用户想要的内容很好地对齐。
例如(简化一吨),用户的报告将变成查询:
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 列,并且不能在每列上添加索引和可能的列变化,所以我试图弄清楚我们是否可以利用我们已经拥有的东西来加快速度那些边缘情况查询。
希望我说得好。提前致谢 :)
解决方案
我的问题是 - MySQL 是否会使用复合索引进行如下查询:...
不,不会的。Not equals ( !=
) 匹配不可索引,因此索引必须以 colB 开头才能使索引可用。如果您将索引从 (colA, colB, colC) 更改为 (colB, colA, colC),则该索引将可用于您提到的第一个查询和您正在询问的查询。
推荐阅读
- python - TypeError: 'module' object is not callable 。如何解决这个问题呢
- r - 图像适合框元素 - R Shiny
- teradata - SQL拉24岁客户
- reactjs - 组件没有收到路由道具
- python - 通过 exchangelib 发送受密码保护的文件
- python - 创建一个 python gui pdf 提取应用程序?当我设置 if 语句时,宽度函数弹出错误?
- excel - Excel 单元格参考失败
- python - 为什么循环不在单独的线程中停止?
- python - discord.py keyerror 中的歌词命令
- java - 如何获取字符串的正则表达式模式?