これは、「効率的に 7.300.000.000 行を格納する」(効率的に 7.300.000.000 行を格納する) という私の質問へのフォローアップです。
パーティショニングで MySQL を使用することにしました。予備のスキーマは次のようになります。
CREATE TABLE entity_values (
entity_id MEDIUMINT UNSIGNED DEFAULT 0 NOT NULL, # 3 bytes = [0 .. 16.777.215]
date_id SMALLINT UNSIGNED DEFAULT 0 NOT NULL, # 2 bytes = [0 .. 65.535]
value_1 MEDIUMINT UNSIGNED DEFAULT 0 NOT NULL, # 3 bytes = [0 .. 16.777.215]
value_2 MEDIUMINT UNSIGNED DEFAULT 0 NOT NULL, # 3 bytes = [0 .. 16.777.215]
UNIQUE KEY (entity_id, date_id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 PARTITION BY HASH(entity_id) PARTITIONS 25;
これは与える:
- 行 = 7.300.000.000 行 (前の投稿に記載されている要件による)
- サイズ/行 = 11 バイト (3+2+3+3)
- 合計サイズ = 7.300.000.000 行 * 11 バイト = 80.300.000.000 バイト = 80.3 GB
- パーティション = 25 (3.2 GB/パーティション、パーティション サイズは多少任意)
「id」列は使用されないため、元の設計から主キーを削除したことに注意してください。
さて、私の質問ですが、前回の投稿で概説した要件と上記のスキーマを考慮して、さらに最適化/調整できる提案はありますか? または、MySQL を使用することにした場合、上記のスキーマは「最適」ですか?
更新:現在のデータ セットを上記のスキーマにロードしようとしましたが、8.570.532 行で 212.000.000 バイト相当のディスク領域が必要になり、1 行あたり約 24.7 バイトになります。
更新: entity_id+date_id をカバーするインデックスは、entity_id のみをターゲットとするクエリにも使用されることに注意してください。