Pomyśl o indeksie jako o „spisie treści” ... to uporządkowana lista wskaźników do pozycji w pliku, czyli przesunięć. Załóżmy, że masz miliony rekordów zapisanych w tabeli, zamiast przeszukiwać tabelę w celu znalezienia pasujących kryteriów, znacznie szybciej jest odwoływać się do uporządkowanej listy w celu znalezienia dopasowań, a następnie układać wskaźniki w określone pasujące wiersze. Doskonałym przykładem indeksu jest pole klucza podstawowego tabeli, najczęściej jego pole „id”. Jeśli chcesz mieć identyfikator wiersza # 11234566, znacznie szybciej zapytaj indeksu o wskaźnik do danych niż w przypadku skanowania źródła danych w poszukiwaniu pozycji 11234566.
Oto nie tak oczywiste zastosowanie indeksowania:
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)
);
Operacja może utworzyć rekord dziennika, ale następnie utworzyć odwołanie do zindeksowanej daty / godziny, która jest szybsza do wyszukiwania / sortowania niż tabela dziennika. Następnie ponownie dołącz tabelę dziennika do własnego klucza podstawowego. Jeśli potrzebujesz mnie rozwinąć, daj mi znać. Mam nadzieję, że to ma sens.
Przykładowe zapytanie:
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';