Pensa a un indice come a "indice" ... che è un elenco ordinato di puntatori a posizioni in un file, noto anche come offset. Supponi di avere milioni di record memorizzati in una tabella, piuttosto che cercare nella tabella i criteri di corrispondenza, è molto più veloce fare riferimento a un elenco ordinato per le corrispondenze, quindi impilare i puntatori sulle righe di corrispondenza specifiche. Un esempio perfetto di un indice è un campo chiave primaria delle tabelle, in genere il suo campo "id". Se si desidera l'ID riga # 11234566, è molto più veloce chiedere all'indice un puntatore ai dati piuttosto che scansionare l'origine dati per la posizione 11234566.
Ecco un uso non così ovvio dell'indicizzazione:
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)
);
L'operazione può creare il record del registro, ma quindi creare un riferimento a un datetime indicizzato che è più veloce da cercare / ordinare rispetto alla tabella del registro. Quindi unire nuovamente la tabella dei registri sulla propria chiave primaria. Se hai bisogno di me per approfondire questo, fammi sapere. Spero che abbia senso.
Query di esempio:
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';