MariaDB / TokuDB中“指定了太多密钥;允许最多64个密钥”错误的解决方法?

时间:2015-06-14 22:58:43

标签: mysql database database-design mariadb tokudb

我需要在一个表上创建超过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”错误会妨碍这一点。

0 个答案:

没有答案