テーブルに 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;
残念ながら、「キーが多すぎます」というエラーがこれを妨げています。