Ich arbeite an einem Event-Tracking-System, das eine Handvoll Lookup-Tabellen sowie die primäre Logging-Tabelle verwendet. In einem Bericht, den ich schreibe, kann ein Objekt ausgewählt werden, um Statistiken anzuzeigen. Die Oberfläche zeigt alle Objekte in der Reihenfolge abnehmender Wichtigkeit (dh Treffer) an.Index verwenden, temporäre verwenden, mit filesort - wie das zu beheben?
Das Schema für die beiden Tabellen (leicht abgespeckte, aber Sie erhalten den Kern):
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`)
);
Die Abfrage ich Probleme mit ist unten angegeben ist, bin. Es funktioniert gut mit meiner Tabelle von ~ 100 Einträge, aber die EXPLAIN beunruhigt mich ein wenig.
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
Also - was mit meinem Schema falsch ist und/oder Abfrage für MySQL zurück auf temporary
und filesort
zu fallen? Oder ist es so optimiert, wie es mit ORDER BY möglich ist?
Die maximale Anzahl der Objekte, die ich je von dieser Abfrage zurückgeben würde, ist <300, obwohl ich möglicherweise Millionen von Zeilen in der event_log habe. Ich habe bestätigt, dass 'using temporary' und' using filesort' weggehen, wenn ich ORDER BY entferne. Ich werde versuchen, dies zu ändern, so dass ich die Reihenfolge (in einem Array) mit der Skriptsprache (PHP) mache. Danke für Ihre Antwort und Links. –
Es kann immer noch effizienter sein, die Sortierung in MySQL zu tun - es hat bereits die Daten in einer Datenstruktur geladen usw. –
Es wäre sicherlich sauberer. Danke für die Rückmeldung. –