ご存知のように、SQLServerは
SQLServerでは、この手法を利用するには、テーブルではなくビューに対してクエリを実行する必要があります。つまり、ビューとインデックスについて知っておく必要があります。
MySQLにはインデックス付きビューがありませんが、テーブル+トリガー+インデックスを使用して動作をシミュレートできます 。
ビューを作成する代わりに、インデックス付きテーブル、データテーブルを最新の状態に保つためのトリガーを作成する必要があります。次に、正規化されたテーブルではなく、新しいテーブルをクエリする必要があります。
書き込み操作のオーバーヘッドが読み取り操作の改善を相殺するかどうかを評価する必要があります。
編集済み:
新しいテーブルを作成する必要は必ずしもないことに注意してください。たとえば、1:N関係(マスター-詳細)トリガーでは、フィールドのコピーを「マスター」テーブルから「詳細」テーブルに保持できます。あなたの場合:
CREATE TABLE tableOne (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
tableTwoId INT UNSIGNED NOT NULL,
objectId INT UNSIGNED NOT NULL,
desnormalized_eventTime DATETIME NOT NULL,
INDEX (objectID),
FOREIGN KEY (tableTwoId) REFERENCES tableTwo (id)
) ENGINE=InnoDB;
CREATE TRIGGER tableOne_desnormalized_eventTime
BEFORE INSERT ON tableOne
for each row
begin
DECLARE eventTime DATETIME;
SET eventTime =
(select eventTime
from tableOne
where tableOne.id = NEW.tableTwoId);
NEW.desnormalized_eventTime = eventTime;
end;
これは挿入前のトリガーであることに注意してください。
これで、クエリは次のように書き直されます。
select * from tableOne t1
inner join tableTwo t2 on t1.tableTwoId = t2.id
where t1.objectId = '..'
order by t1.desnormalized_eventTime;
免責事項:テストされていません。