Sto lavorando a un sistema di tracciamento eventi che utilizza una manciata di tabelle di ricerca e la tabella di registrazione principale. In una relazione che sto scrivendo, è possibile selezionare un oggetto per visualizzare le statistiche. L'interfaccia mostra tutti gli oggetti in ordine di importanza decrescente (es. Colpi).Uso dell'indice, usando temporaneamente, usando filesort - come risolvere questo problema?
Lo schema per le due tabelle (scarsamente tagliati giù, ma si ottiene il succo):
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`)
);
La query Ho problemi con è al di sotto. Funziona perfettamente con la mia tabella di ~ 100 voci, ma la SPIEGAZIONE mi preoccupa un po '.
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
Returns: Using index; Using temporary; Using filesort
Quindi - cosa c'è di sbagliato con il mio schema e/o query per MySQL a ripiegare su temporary
e filesort
? O è ottimizzato in quanto può utilizzare ORDER BY?
Il numero massimo di oggetti che avessi mai ritorno da questa query è <300, anche se devo avere potenzialmente milioni di righe nel event_log. Ho confermato che 'utilizzando temporaneamente' e' using filesort' scompaiono quando rimuovo ORDER BY. Cercherò di cambiare questo in modo che io faccia l'ordine (in un array) con il linguaggio di scripting (PHP). Grazie per la tua risposta e link. –
Potrebbe essere ancora più efficiente eseguire l'ordinamento in MySQL: ha già i dati caricati in una struttura dati, ecc. –
Sarebbe certamente più pulito. Grazie per il feedback. –