10 個のフィールド (テーブル「車」) を持つ約 2,000,000 行を含む MySQL INNODB テーブルがあります。年間約 500,000 行の現在の速度で徐々に増加し続けます。これは、24 時間 365 日、1 秒間に平均 2 ~ 3 回、さまざまな種類のクエリを取得するビジーなテーブルです。
現在の状況では、情報を拡張して INT フィールド ("country_id") を含める必要があります。ただし、このフィールドはすべての行の少なくとも 99% でデフォルトの "1" になります。
私の質問は次のとおりです。次の解決策のいずれかを実行する特定の理由はありますか。
- INT フィールドをテーブルに追加し、インデックスを作成します ("cars"."country_id")
- フィールド「car_id」と「country_id」を含むリレーショナル テーブル (「car_countries」) を追加します。
テスト環境でこれらの例をセットアップし、これを見つけるためにデータのテーブルをクエリすることを数千回繰り返しました。
- データベース/テーブルのサイズは、インデックスが 19 % (~21 MB) 増加するためです。
- クエリは平均で 16% 長くかかります (1,000 クエリごとに 0.37717 秒対 0.32431 秒)
私は以前、テーブルにすべてのフィールドの適切な情報を入力し、テーブルに必須ではない情報が必要な場合にリレーショナル テーブルを追加しようとしましたが、データを配列する必要がない限り、これにはほとんどメリットがないことを読みました。 (MySQL は処理しません (PostgreSQL は処理します)) を表に示します。私の例では、特定の車が 2 つの国に販売されることはないため、特定の車にさらに国を追加する必要はありません。
解決策 1 を使用すると、ほとんどすべてが簡単になります。ディスク容量はそれほど重要ではありません。とにかく解決策 2 を検討する必要がありますか? もしそうなら、なぜですか?
よろしくお願いします、
/トーマス