次のテーブルがあるとします
CREATE TABLE `entities` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`timestamp` TIMESTAMP NOT NULL
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`data` VARCHAR(255),
PRIMARY KEY (`id`,`timestamp`)
);
各エンティティは通常、 によってのみ参照されますid
。ただし、エンティティごとに複数のリビジョンがあり、 によって明確にされていtimestamp
ます。私のクエリの大部分は最新のリビジョンを選択するもので、新しいリビジョンを挿入するのはほんの一握りで、過去のリビジョンをすべて選択するのはさらに少数です。私は、平均して 1 ダース程度の改訂しか期待していませんid
。
最新のリビジョンを選択する最も効率的な (パフォーマンスとストレージ容量の点で) 方法は何ですか? この問題に対して受け入れられている慣行はありますか?
私が見ているように、2 つの方法があります。GROUP BY
CREATE VIEW groupedEntities AS
SELECT id, max(timestamp) AS maxt FROM entities GROUP BY id;
CREATE VIEW currentEntities AS
SELECT a.id, data, timestamp FROM groupedEntities AS a
INNER JOIN entities AS b ON b.id=a.id AND b.timestamp=a.maxt
WHERE timestamp <= CURRENT_TIMESTAMP;
SELECT * FROM currentEntities WHERE id=?;
<=CURRENT_TIMESTAMP
タイムスタンプを遠い未来に設定することにより、エンティティを「削除」できることに注意してください。(2) 現在のリビジョンを保存する別のテーブルを作成する
CREATE TABLE currentEntities (
`id` INT(10) UNSIGNED PRIMARY KEY,
`timestamp` TIMESTAMP,
CONSTRAINT FOREIGN KEY (`id`, `timestamp`)
REFERENCES `entities` (`id`,`timestamp`)
);
SELECT * FROM currentEntites INNER JOIN groupedEntities WHERE id=?;
または他のオプション(3)?