我需要在一个表上创建超过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字符串,value1 tinyint,value2 float) - 因为最多可以有5000个唯一列sample_id值,每个(x_position,sample_id)对都存在不同的value1,最大行数为1亿x 5000 = 500亿行
我需要做的查询是:
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列(分成几个表以避免列限制),这似乎优于500亿行。此外,它将消除查询中“or”和“group by”子句的需要,允许重写查询,如:
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;
不幸的是,“Too many keys”错误会妨碍这一点。