Dies fühlt sich an wie eine "mach meine Hausaufgaben für mich" Art von Frage, aber ich bin wirklich hier stecken zu versuchen, diese Abfrage schnell gegen eine Tabelle mit vielen vielen Zeilen ausführen. Here's a SQLFiddle, die das Schema (mehr oder weniger) zeigt.Abfrage für Tabelle mit Hunderten von Millionen von Zeilen optimieren
Ich habe mit den Indizes gespielt und versucht, etwas zu bekommen, das alle erforderlichen Spalten zeigen wird, aber nicht viel Erfolg gehabt habe. Hier ist die create
:
CREATE TABLE `AuditEvent` (
`auditEventId` bigint(20) NOT NULL AUTO_INCREMENT,
`eventTime` datetime NOT NULL,
`target1Id` int(11) DEFAULT NULL,
`target1Name` varchar(100) DEFAULT NULL,
`target2Id` int(11) DEFAULT NULL,
`target2Name` varchar(100) DEFAULT NULL,
`clientId` int(11) NOT NULL DEFAULT '1',
`type` int(11) not null,
PRIMARY KEY (`auditEventId`),
KEY `Transactions` (`clientId`,`eventTime`,`target1Id`,`type`),
KEY `TransactionsJoin` (`auditEventId`, `clientId`,`eventTime`,`target1Id`,`type`)
)
Und (eine Version) die select
:
select ae.target1Id, ae.type, count(*)
from AuditEvent ae
where ae.clientId=4
and (ae.eventTime between '2011-09-01 03:00:00' and '2012-09-30 23:57:00')
group by ae.target1Id, ae.type;
ich am Ende mit einem 'Verwenden von temporär' und 'Verwenden von filesort' auch. Ich habe versucht, die count(*)
fallen zu lassen und select distinct
stattdessen zu verwenden, die den "Using filesort" nicht verursacht. Dies wäre wahrscheinlich in Ordnung, wenn es einen Weg zu join
zurück geben würde, um die Zählimpulse zu erhalten.
Ursprünglich wurde die Entscheidung getroffen, target1Name und target2Name der Ziele so zu verfolgen, wie sie bei der Erstellung des Prüfdatensatzes vorhanden waren. Ich brauche diese Namen auch (die neuesten werden es tun).
Derzeit läuft die Abfrage (oben, mit fehlenden spalten target1Name und target2Name) in etwa 5 Sekunden auf ~ 24 Millionen Datensätze. Unser Ziel liegt bei Hunderten von Millionen und wir möchten, dass die Abfrage weiterhin in diese Richtung geht (in der Hoffnung, es unter 1-2 Minuten zu halten, aber wir hätten es gerne viel besser), aber meine Angst ist einmal Wir treffen diese größere Menge an Daten, die es nicht tun wird (es wird daran gearbeitet, zusätzliche Zeilen zu simulieren).
Ich bin mir nicht sicher, die beste Strategie, um die zusätzlichen Felder zu bekommen. Wenn ich die Spalten direkt in die select
hinzufügen, verliere ich den 'Using Index' auf die Abfrage. Ich habe versucht, eine join
zurück in die Tabelle, die den "Using index" hält aber dauert etwa 20 Sekunden.
Ich habe versucht, die Spalte eventTime zu einem int anstatt zu einem Datetime zu ändern, aber das schien nicht die Indexnutzung oder Zeit zu beeinflussen.
Was ist Ihre aktuelle Abfrage Timing und was Sie unter verstehen "schnell"? – feeela
Entschuldigung, haben diese Details hinzugefügt –
Haben Sie Indizes für clientId und eventTime? Stellen Sie außerdem sicher, dass Sie den eventTime-Index verwenden und keinen vollständigen Tabellenscan durchführen. –