私たちは、鳥の記録の大規模な(そして成長している)MySQL データベースを持っています。現在、次のように簡略化された 3 つのメイン テーブルがあります。
RECORDS (id, birdid, tripid, gender, age) PRIMARY KEY id
BIRDTRIPS (id, locid, date, starttime, endtime, notes) PRIMARY KEY id
LOCATIONS (id, description, centerlat, centerlng) PRIMARY KEY id
すべての ID は INT で、日付は DATE 型です。
パフォーマンスを向上させるために、日付と locid を RECORDS に複製することで非正規化を行うことにしました。
RECORDS (id, birdid, tripid, gender, age, locid, date) PRIMARY KEY id
このようにして、多くのクエリで BIRDTRIPS と LOCATIONS への高価な結合を回避できます。
MySQL にはテーブルごとにクラスター化されたインデックスが 1 つだけあり、これが常に主キーになります。RECORDS
を試しPRIMARY KEY (date, id)
て、クラスター化されたインデックスを活用して、日付列の範囲スキャンとテーブルのパーティション分割を高速化しようとしています。同じ日付に多くのレコードが存在する可能性があるため、ID はキーにのみ含まれています。理論的には、主キーは多くの場合、ID で「無駄」になることが多く、ルックアップにはクラスター化されていない UNIQUE インデックスで十分です。
そして今、私の質問:
このアプローチで実際の経験をお持ちの方はいらっしゃいますか? 私が見落としているかもしれない欠点はありますか?