我需要在一个表上创建超过 64 个索引,但遇到了“指定的键太多;最多允许 64 个键”错误。是否有一些解决方法可以让我将 MariaDb / TokuDB 的这个限制增加到 1000 以上?或者有理由为什么这个限制是必要的?
(我已经看到这个问题被问到/回答了 MySQL - 答案是将 --with-max-indexes=256 传递给 ./configure,或者在编译时修改其中一个头文件中的 MAX_KEY。不幸的是,这些答案似乎不适用于 MariaDB)
附言。由于典型的响应是“如果您需要这么多索引,那么您做错了”,我将解释我为什么要这样做,如果这是最好的“解决方法”,我将不胜感激有关修改设计的任何建议。
我的数据存储在 2 个表中:
table1存储 5 列:(唯一键 x_position int、column1 string、column2 float、column3 int、column4 tinyint) ——它可以大到 1 亿行
table2在概念上可以表示为 4 列: (外键 x_position int, sample_id string, value1 tinyint, value2 float) - 因为可能有多达 5000 个唯一的 sample_id 值,并且每个 (x_position, sample_id) 对存在不同的 value1 ,最大行数为 1 亿 x 5000 = 5000 亿行
我需要做的查询是:
select column1, column2, column3... sample_id,
group_concat(value1)
from table1, table2
where column1 = string1
and column2 < float2
and ( (sample_id = string1 and value1=1)
or (sample_id = string2 and value1=0)
or (sample_id = string3 and value1=1)
)
and value2 < float1
group by sample_id;
相反,我认为对 table2 进行透视会更有效,这样它的列是:( 外键 x_position,sample_id1_value1 tinyint,sample_id1_value2 float,sample_id2_value1 tinyint,sample_id2_value2 float,...)
然后根据将一起查询这些列中的哪些列的特定于域的详细信息,在 (sample_id1_value1, sample_id1_value2, .. ) 列的小子集上创建复合索引。该表将有 1 亿行 x 10,000 列(拆分为多个表以避免列限制),这似乎比 5000 亿行要好。此外,它还将消除查询中对“或”和“分组依据”子句的需求,允许将查询重写为:
select column1, column2, column3... sample_id,
sample_id1_value1,
sample_id1_value2
from table1, table2
where column1 = string1
and column2 < float2
and sample_id1_value1=1
and sample_id2_value1=0
and sample_id3_value1=1
and sample_id1_value2 < float1
and sample_id2_value2 < float1
and sample_id3_value2 < float1;
不幸的是,“太多键”错误阻碍了这一点。