Pense em um índice como "índice" ... que é uma lista ordenada de ponteiros para posições em um arquivo, também conhecidas como compensações. Digamos que você tenha milhões de registros armazenados em uma tabela, em vez de pesquisar na tabela por critérios de correspondência, é muito mais rápido fazer referência a uma lista ordenada por correspondências e empilhar os ponteiros para as linhas correspondentes específicas. Um exemplo perfeito de um índice é um campo de chave primária de tabelas, geralmente o campo "id". Se você deseja o ID da linha # 11234566, é muito mais rápido solicitar ao índice um ponteiro para os dados do que procurar na fonte de dados a posição 11234566.
Aqui está um uso não tão óbvio da indexação:
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)
);
Sua operação pode criar seu registro de log, mas depois criar uma referência a um datetime indexado que seja mais rápido para pesquisar / classificar do que sua tabela de log. Em seguida, junte novamente sua tabela de log em sua própria chave primária. Se você precisar que eu expanda isso, me avise. Espero que isto faça sentido.
Consulta de amostra:
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';