0

ほとんどのフィールドが長い文字列 (DNA シーケンス) である巨大なデータベースがあります。現在、約 5 億行です。私の最初のテーブルでは、このデータ構造に実装される 5 億行すべてが必要です。

Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Null 

0          | PRIMARY  | 1            | prim_id     | A         | 2654074     | NULL     | NULL   |      
1          | cdr3seq  | 1            | cdr3seq     | A         | 2654074     | NULL     | NULL   | 
1          | cdr3aa   | 1            | cdr3aa      | A         | 2654074     | NULL     | NULL   | 
1          | v_gene   | 1            | vg          | A         | 53081       | NULL     | NULL   | 
1          | d_gene   | 1            | dg          | A         | 46562       | NULL     | NULL   | 
1          | j_gene   | 1            | jg          | A         | 14269       | NULL     | NULL   | 
1          | donor    | 1            | donor       | A         | 1092        | NULL     | NULL   |      
1          | seq_id   | 1            | seq_id      | A         | 2654074     | NULL     | NULL   |      
1          | seq      | 1            | seq         | A         | 2654074     | NULL     | NULL   |      

それらはすべて B ツリーであり、同じテーブルです (収まるように省略 - アップロードのプロセスから取得されたカーディナリティは無視します)。auto_increment プライマリ ID (prim_id) のみを使用して、このテーブルを簡単にアップロードできます。しかし、インデックスを追加すると、巨大な一時テーブルを書き出すのに永遠に時間がかかります。一方、最初にテーブルを設計すると、アップロードに永遠に時間がかかります。欠落しているSQLサーバーオプションはありますか? 現在、Innodb エンジンを実行しています。避けられないインデックス作成を待っていますか? これを行う必要があるのは、これらの列のすべてが最終的にある時点でグループ化されるためです。たとえば、このテーブルから一意の別のテーブルを作成したいのですがseq、最初にこのテーブルにインデックスを付けないと作成できません。私はこれを正しい方法で行っていますか?

さらに、一意のテーブルについては、一意のseqインデックス フィールドを使用してデータ ファイルを再アップロードしようとしました。これも時間かかりすぎ。

本当にありがとう、

PS、私はこのデータのみを扱う 24 コア 64 GB サーバーを使用しています。

4

1 に答える 1

0

mysql を使用すると、一意でないインデックスを一時的に無効にすることができます。

ALTER TABLE tbl_name DISABLE KEYS;

-- Do lots of inserts without updating the index every row

ALTER TABLE tbl_name ENABLE KEYS; -- Indexes are refreshed once here

挿入をさらに高速化するには、挿入ごとにコミットするのではなく、トランザクションで挿入をラップします。

ALTER TABLE tbl_name DISABLE KEYS;

START TRANSACTION;
-- Do lots of inserts without updating the index or committing every row
COMMIT; -- Inserts are committed in one operation here

ALTER TABLE tbl_name ENABLE KEYS; -- Indexes are refreshed once here

各トランザクションでロードしすぎないように注意してください。そうしないと、ログの上限に達して例外が発生し、すべてがロールバックされます (試行錯誤しますが、一度に 10000 を試してください)。

于 2012-12-17T05:57:06.203 に答える