Ich bin ziemlich neu in MySQL und ich versuche, eine bestimmte Menge von Zeilen wählen mit dieser Anweisung:DISTINCT-Anweisung in MySQL SELECT nimmt 10 Minuten
SELECT DISTINCT sp.atcoCode, sp.name, sp.longitude, sp.latitude
FROM `transportdata`.stoppoints as sp
INNER JOIN `vehicledata`.gtfsstop_times as st ON sp.atcoCode = st.fk_atco_code
INNER JOIN `vehicledata`.gtfstrips as trip ON st.trip_id = trip.trip_id
INNER JOIN `vehicledata`.gtfsroutes as route ON trip.route_id = route.route_id
INNER JOIN `vehicledata`.gtfsagencys as agency ON route.agency_id = agency.agency_id
WHERE agency.agency_id IN (1,2,3,4);
Allerdings ist die select-Anweisung nimmt um 10 Minuten, also ist etwas klar im Gange. Ein wichtiger Faktor ist, dass die Tabelle gtfsstop_times
sehr groß ist. (~ 250 Millionen Datensätze)
Indizes scheinen ordnungsgemäß eingerichtet zu sein; Alle obigen Joins verwenden indizierte Spalten. Tischgrößen sind, etwa:
gtfsagencys - 4 rows
gtfsroutes - 56,000 rows
gtfstrips - 5,500,000 rows
gtfsstop_times - 250,000,000 rows
`transportdata`.stoppoints - 400,000 rows
Der Server verfügt über 22 GB Speicher, ich habe den InnoDB-Pufferpool zu 8G gesetzt und ich bin mit MySQL 5.6.
Kann jemand einen Weg sehen, diesen Lauf schneller zu machen? Oder überhaupt!
Ist es wichtig, dass die Stoppoints-Tabelle in einem anderen Schema ist?
EDIT: EXPLAIN SELECT ... gibt diese:
Wie funktioniert das, wenn Sie das Qualifikationsmerkmal "DISTINCT" weglassen? Was erhalten Sie, wenn Sie 'EXPLAIN' in der Abfrage verwenden? –
Was ist der Erklärungsplan? Fügen Sie es in Pastebin oder einen Kern ein –
Ich bin nicht sicher, wie ich das testen würde, da, wenn ich den Qualifier weglasse, ungefähr 250 Millionen Zeilen zurückgegeben werden. Tut mir leid, wenn das Unsinn erscheint, bin ich ein wenig neu beim Testen/Debuggen von Abfragen. –