Considérez un index comme une "table des matières" ... c'est-à-dire une liste ordonnée de pointeurs vers des positions dans un fichier, aussi appelés décalages. Supposons que vous ayez des millions d'enregistrements stockés dans une table, plutôt que de rechercher dans la table des critères de correspondance, il est beaucoup plus rapide de référencer une liste ordonnée pour les correspondances, puis d'empiler les pointeurs sur les lignes correspondantes spécifiques. Un exemple parfait d'un index est un champ de clé primaire de tables, le plus souvent son champ "id". Si vous voulez l'ID de ligne # 11234566, il est beaucoup plus rapide de demander à l'index un pointeur sur les données que de scanner la source de données pour la position 11234566.
Voici une utilisation moins évidente de l'indexation:
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)
);
Votre opération peut créer votre enregistrement de journal, mais ensuite créer une référence à un datetime indexé qui est plus rapide à rechercher / trier que votre table de journal. Rejoignez ensuite votre table de journal sur sa propre clé primaire. Si vous avez besoin de moi pour développer cela, faites le moi savoir. J'espère que cela a du sens.
Exemple de requête:
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';