Думайте об индексе как о «оглавлении» ... это упорядоченный список указателей на позиции в файле, то есть смещения. Скажем, у вас есть миллионы записей, хранящихся в таблице, вместо того, чтобы искать в таблице критерии соответствия, гораздо быстрее ссылаться на упорядоченный список совпадений, а затем складывать указатели на конкретные совпадающие строки. Прекрасным примером индекса является поле первичного ключа таблицы, чаще всего его поле «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';