Như bạn đã biết, SQLServer đạt được điều này với chế độ xem được lập chỉ mục :
Trong SQLServer, để tận dụng lợi thế của kỹ thuật này, bạn phải truy vấn qua dạng xem chứ không phải trên bảng. Điều đó có nghĩa là bạn nên biết về chế độ xem và chỉ mục.
MySQL không có các chế độ xem được lập chỉ mục, nhưng bạn có thể mô phỏng hành vi với bảng + trình kích hoạt + chỉ mục .
Thay vì tạo một dạng xem, bạn phải tạo một bảng được lập chỉ mục, một trình kích hoạt để giữ cho bảng dữ liệu được cập nhật và sau đó, bạn phải truy vấn bảng mới của mình thay vì các bảng chuẩn hóa của bạn.
Bạn phải đánh giá xem chi phí hoạt động ghi có bù đắp sự cải thiện trong hoạt động đọc hay không.
Đã chỉnh sửa:
Lưu ý rằng không phải lúc nào cũng cần thiết phải tạo một bảng mới. Ví dụ:trong trình kích hoạt mối quan hệ 1:N (chính-chi tiết), bạn có thể giữ bản sao của một trường từ bảng 'chính' vào bảng 'chi tiết'. Trong trường hợp của bạ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;
Lưu ý rằng đây là trình kích hoạt chèn trước.
Bây giờ, truy vấn được viết lại như sau:
select * from tableOne t1
inner join tableTwo t2 on t1.tableTwoId = t2.id
where t1.objectId = '..'
order by t1.desnormalized_eventTime;
Tuyên bố từ chối trách nhiệm:không được kiểm tra.