2

10 個のフィールド (テーブル「車」) を持つ約 2,000,000 行を含む MySQL INNODB テーブルがあります。年間約 500,000 行の現在の速度で徐々に増加し続けます。これは、24 時間 365 日、1 秒間に平均 2 ~ 3 回、さまざまな種類のクエリを取得するビジーなテーブルです。

現在の状況では、情報を拡張して INT フィールド ("country_id") を含める必要があります。ただし、このフィールドはすべての行の少なくとも 99% でデフォルトの "1" になります。

私の質問は次のとおりです。次の解決策のいずれかを実行する特定の理由はありますか。

  1. INT フィールドをテーブルに追加し、インデックスを作成します ("cars"."country_id")
  2. フィールド「car_id」と「country_id」を含むリレーショナル テーブル (「car_countries」) を追加します。

テスト環境でこれらの例をセットアップし、これを見つけるためにデータのテーブルをクエリすることを数千回繰り返しました。

  1. データベース/テーブルのサイズは、インデックスが 19 % (~21 MB) 増加するためです。
  2. クエリは平均で 16% 長くかかります (1,000 クエリごとに 0.37717 秒対 0.32431 秒)

私は以前、テーブルにすべてのフィールドの適切な情報を入力し、テーブルに必須ではない情報が必要な場合にリレーショナル テーブルを追加しようとしましたが、データを配列する必要がない限り、これにはほとんどメリットがないことを読みました。 (MySQL は処理しません (PostgreSQL は処理します)) を表に示します。私の例では、特定の車が 2 つの国に販売されることはないため、特定の車にさらに国を追加する必要はありません。

解決策 1 を使用すると、ほとんどすべてが簡単になります。ディスク容量はそれほど重要ではありません。とにかく解決策 2 を検討する必要がありますか? もしそうなら、なぜですか?

よろしくお願いします、

/トーマス

4

2 に答える 2

0

bwoebi、Raphaël Althaus、AgRizzo、Alfons、Ed Gibbs の質問への回答に感謝します。

簡単な要約:

  • 車に 2 つの国が存在することはあり得ないため、必要な追加フィールドは 1 つだけです。
    • 解決策 1を使用する
  • また、インデックスはおそらく必要ありません。特定のシナリオでカーディナリティとパフォーマンスを確認してください。

/トーマス

于 2013-10-15T09:27:17.647 に答える