Usando o índice, usando temporário, usando o filesort - como consertar isso?
Eu estou trabalhando em um sistema de controle de eventos que usa um punhado de tabelas de pesquisa, bem como a tabela de registro principal. Em um relatório que estou escrevendo, um objeto pode ser selecionado para exibir estatísticas. A interface mostra todos os objetos em ordem decrescente de importância (ou seja, hits).
O esquema para as duas tabelas (ligeiramente reduzido, mas você obtém a essência):
CREATE TABLE IF NOT EXISTS `event_log` (
`event_id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(5) DEFAULT NULL,
`object_id` int(5) DEFAULT NULL,
`event_date` datetime DEFAULT NULL,
PRIMARY KEY (`event_id`),
KEY `user_id` (`user_id`),
KEY `object_id` (`object_id`)
);
CREATE TABLE IF NOT EXISTS `lookup_event_objects` (
`object_id` int(11) NOT NULL AUTO_INCREMENT,
`object_desc` varchar(255) NOT NULL,
PRIMARY KEY (`object_id`)
);
A consulta com a qual estou tendo problemas está abaixo. Funciona bem com minha tabela de ~ 100 entradas, mas o EXPLAIN me preocupa um pouco.
explain SELECT
el.object_id,
leo.object_desc,
COUNT(el.object_id) as count_rows
FROM
event_log el
LEFT JOIN lookup_event_objects leo ON leo.object_id = el.object_id
GROUP BY
el.object_id
ORDER BY
count_rows DESC,
leo.object_desc ASC
Retorna:Using index; Using temporary; Using filesort
Então - o que há de errado com o meu esquema e / ou consulta para o MySQL para recorrertemporary
efilesort
? Ou é tão otimizado quanto possível usando o ORDER BY?