1

テーブルに 64 個を超えるインデックスを作成する必要がありますが、「指定されたキーが多すぎます。最大 64 個のキーが許可されています」というエラーが発生します。MariaDb/TokuDB でこの制限を 1000 を超えて増やすことができる回避策はありますか? または、この制限が必要な理由はありますか?

(この質問が MySQL について尋ねられた/回答されたのを見たことがあります - 答えは --with-max-indexes=256 を ./configure に渡すか、コンパイル時にヘッダー ファイルの 1 つで MAX_KEY を変更することです。残念ながら、これらは回答は MariaDB では機能しないようです)

Ps。典型的な回答は「これほど多くのインデックスが必要な場合、何か間違ったことをしている」というものなので、なぜこれを行う必要があるのか​​を説明し、それが最善の「回避策」である場合は、設計を変更するためのアドバイスをいただければ幸いです。

私のデータは2つのテーブルに保存されています:

table1には 5 つの列が格納されます: (unique key 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 = 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 をピボットする方が効率的であると考えていました

次に、(sample_id1_value1、sample_id1_value2、..) 列の小さなサブセットに複合インデックスを作成します。これは、これらの列のどれが一緒にクエリされるかというドメイン固有の詳細に基づいています。このテーブルには 1 億行 x 10,000 列 (列の制限を避けるために複数のテーブルに分割) があり、5,000 億行よりも優れているように見えます。また、クエリで「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; 

残念ながら、「キーが多すぎます」というエラーがこれを妨げています。

4

0 に答える 0