Hãy nghĩ về một chỉ mục là "mục lục" ... đó là một danh sách được sắp xếp các con trỏ tới các vị trí trong một tệp, còn gọi là offset. Giả sử rằng bạn có hàng triệu bản ghi được lưu trữ trong một bảng, thay vì tìm kiếm bảng cho các tiêu chí khớp, sẽ nhanh hơn nhiều khi tham chiếu danh sách được sắp xếp cho các kết quả khớp, sau đó xếp các con trỏ vào các hàng khớp cụ thể. Một ví dụ hoàn hảo về chỉ mục là trường khóa chính của bảng, điển hình nhất là trường "id" của nó. Nếu bạn muốn id hàng # 11234566, yêu cầu chỉ mục cho con trỏ tới dữ liệu nhanh hơn nhiều so với quét nguồn dữ liệu cho vị trí 11234566.
Đây là một cách sử dụng lập chỉ mục không quá rõ ràng:
CREATE TABLE activity_log (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
activity_type_id SMALLINT UNSIGNED NOT NULL,
datetime_created DATETIME
KEY(activity_type_id),
PRIMARY KEY(id)
);
CREATE TABLE activity_log_to_date_key (
activity_log_id INT UNSIGNED NOT NULL,
date_created_key INT UNSIGNED NOT NULL REFERENCES dim_datetime(id),
UNIQUE KEY(activity_log_id),
KEY(date_created_key)
);
CREATE TABLE dim_datetime (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
date_hour DATETIME NOT NULL,
PRIMARY KEY(id),
KEY(date_hour)
);
Hoạt động của bạn có thể tạo bản ghi nhật ký của bạn, nhưng sau đó tạo một tham chiếu đến một datetime được lập chỉ mục nhanh hơn để tìm kiếm / sắp xếp so với bảng nhật ký của bạn. Sau đó tham gia lại bảng nhật ký của bạn trên khóa chính của nó. Nếu bạn cần tôi mở rộng về điều này, hãy cho tôi biết. Tôi hy vọng điều này có ý nghĩa.
Truy vấn mẫu:
SELECT a.activity_log_id, al.activity_type_id, al.datetime_created
FROM activity_log_to_date_key a
INNER JOIN dim_datetime d ON (d.id = a.date_created_key)
LEFT JOIN activity_log al ON (al.id = a.activity_log_id)
WHERE d.date_hour BETWEEN '2009-01-01 00:00:00' AND '2009-06-01 12:00:00';