Подумайте про індекс як "зміст" ... це впорядкований список покажчиків на позиції у файлі, також зсуви. Скажіть, що у вас зберігаються мільйони записів у таблиці, а не шукайте таблицю для відповідності критеріям, набагато швидше посилатись на упорядкований список на відповідність, а потім укладати покажчики на конкретні відповідні рядки. Ідеальним прикладом індексу є поле первинного ключа таблиць, найчастіше його поле "id". Якщо ви хочете ідентифікатор рядка # 11234566, набагато швидше запитати покажчик на вказівник на дані, ніж сканувати джерело даних на позицію 11234566.
Ось не настільки очевидне використання індексації:
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)
);
Ваша операція може створити ваш запис журналу, але потім створити посилання на індексований час дати, який буде швидше шукати / сортувати, ніж ваша таблиця журналів. Потім приєднайтеся до своєї таблиці журналів за власним первинним ключем. Якщо вам потрібно, щоб я розширив це питання, дайте мені знати. Сподіваюся, це має сенс.
Зразок запиту:
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';