Mysql 在WHERE或GROUP BY中选择9列。对于几乎每个排列,有没有比复合索引更好的方法来索引多个列?

Mysql 在WHERE或GROUP BY中选择9列。对于几乎每个排列,有没有比复合索引更好的方法来索引多个列?,mysql,sql,indexing,multi-index,Mysql,Sql,Indexing,Multi Index,我在一个有5亿行的表中有9列,我将在其中执行SELECT查询,所有列可能在WHERE或GROUP BY中,也可能不在其中 例如: 列->A、B、C、D、E、F、I、J、K 查询-> SELECT * FROM table WHERE A = 'x' AND J = 'y' GROUP BY B, E, K 索引和优化数据库的最佳方法是什么?我是否必须为每一列排列做一个多列索引复合索引 对于3个专栏,我知道我可以做到: a、 b,c,b,c,c,a,c 但是9列呢?首先,选择*不适合分组方式。

我在一个有5亿行的表中有9列,我将在其中执行SELECT查询,所有列可能在WHERE或GROUP BY中,也可能不在其中

例如: 列->A、B、C、D、E、F、I、J、K 查询->

SELECT * 
FROM table WHERE A = 'x' AND J = 'y' GROUP BY B, E, K
索引和优化数据库的最佳方法是什么?我是否必须为每一列排列做一个多列索引复合索引

对于3个专栏,我知道我可以做到: a、 b,c,b,c,c,a,c 但是9列呢?

首先,选择*不适合分组方式。幸运的是,MySQL在默认情况下不再允许这种语法

如果你打算:

SELECT B, E, K
FROM table
WHERE A = 'x' AND J = 'y'
GROUP BY B, E, K;

那么最好的索引是在A,J,B,E,K上

你无法达到预期的目标。一些可能的替代方案:

发现最常用的列;然后创建10个索引,每个索引最多包含3列。如果你能帮助最常见的组合,那就足够了

通过Columnstore查看MariaDB

查看插件包


这个查询就是一个例子。所有列可能位于WHERE或GROUP BY子句中,也可能不位于WHERE或GROUP BY子句中。它可以是:从表中选择B,E,K,其中A='x'和J='y'按B,E,K分组;或者从表中选择F,G,其中B='x'和D='y'按F,G分组…我必须为几乎每个列排列创建一个复合索引?@shadow。您应该关注where子句中的平等条件。这些应该是索引中的前导列,但所有9列都可以在WHERE子句中。我必须为每一列的排列创建一个复合索引?