Stellen Sie sich einen Index als "Inhaltsverzeichnis" vor. Dies ist eine geordnete Liste von Zeigern auf Positionen in einer Datei, auch Offsets genannt. Angenommen, Sie haben Millionen von Datensätzen in einer Tabelle gespeichert, anstatt in der Tabelle nach Übereinstimmungskriterien zu suchen. Es ist viel schneller, auf eine geordnete Liste für Übereinstimmungen zu verweisen und dann die Zeiger auf die spezifischen übereinstimmenden Zeilen zu stapeln. Ein perfektes Beispiel für einen Index ist ein Tabellen-Primärschlüsselfeld, in der Regel das Feld "id". Wenn Sie die Zeilen-ID # 11234566 möchten, können Sie den Index viel schneller nach einem Zeiger auf die Daten fragen, als wenn Sie die Datenquelle nach Position 11234566 durchsuchen.
Hier ist eine nicht so offensichtliche Verwendung der Indizierung:
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)
);
Ihre Operation kann Ihren Protokolldatensatz erstellen, erstellt dann jedoch einen Verweis auf eine indizierte Datumszeit, die schneller durchsucht / sortiert werden kann als Ihre Protokolltabelle. Verbinden Sie dann Ihre Protokolltabelle mit einem eigenen Primärschlüssel. Wenn Sie mich brauchen, um dies zu erweitern, lassen Sie es mich wissen. Ich hoffe das macht Sinn.
Beispielabfrage:
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';