ここに質問があります...
192兆件のレコードを考慮して、私の考慮事項は何ですか?
私の主な関心事は速度です。
これが表です...
CREATE TABLE `ref` (
`id` INTEGER(13) AUTO_INCREMENT DEFAULT NOT NULL,
`rel_id` INTEGER(13) NOT NULL,
`p1` INTEGER(13) NOT NULL,
`p2` INTEGER(13) DEFAULT NULL,
`p3` INTEGER(13) DEFAULT NULL,
`s` INTEGER(13) NOT NULL,
`p4` INTEGER(13) DEFAULT NULL,
`p5` INTEGER(13) DEFAULT NULL,
`p6` INTEGER(13) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY (`s`),
KEY (`rel_id`),
KEY (`p3`),
KEY (`p4`)
);
クエリは次のとおりです...
SELECT id, s FROM ref WHERE red_id="$rel_id" AND p3="$p3" AND p4="$p4"
SELECT rel_id, p1, p2, p3, p4, p5, p6 FROM ref WHERE id="$id"
INSERT INTO rel (rel_id, p1, p2, p3, s, p4, p5, p6)
VALUES ("$rel_id", "$p1", "$p2", "$p3", "$s", "$p4", "$p5", "$p6")
ここにいくつかの注意事項があります...
- SELECTは、INSERTよりもはるかに頻繁に実行されます。ただし、一度に数百のレコードを追加したい場合があります。
- 負荷に関しては、数時間は何もありませんが、一度に数千のクエリが発生することもあります。
- これ以上正規化できるとは思わない(組み合わせでp値が必要)
- データベース全体は非常にリレーショナルです。
- これはこれまでで最大のテーブルになります(次に大きいテーブルは約900kです)
更新(2010年8月11日)
興味深いことに、2番目のオプションが与えられました...
192兆個の代わりに2.6 * 10 ^ 16(15個のゼロ、つまり26 兆個)を保存できます...
しかし、この2番目のオプションでは、1つのbigint(18)をテーブルのインデックスとして保存するだけで済みます。それだけです-たった1列です。したがって、値の存在を確認するだけです。時々レコードを追加し、それらを削除することはありません。
だから、単に数字を保存するためのmysqlよりも優れたソリューションが必要だと思うようになります...
この2番目のオプションが与えられた場合、それを使用するか、最初のオプションを使用するか...
[編集]いくつかのテストが行われたというニュースを受け取りました-この設定で1億行は0.0004秒でクエリを返します[/編集]