Lesen this wiki article, fand ich heraus, dass die SELECT-Leistung getötet wird, wenn IN() -Klauseln mit indizierten Spalten in einer MySQL-Datenbank verwenden. Meine Frage ist, wie kann ich meine Abfrage neu schreiben, so dass sie keine IN() -Klausel verwendet, während sie ihre Funktionalität behält?Optimieren Sie eine Abfrage mit IN() -Klauseln
Meine Frage ist:
SELECT
`Route`.`route_id`, `Route`.`order`, `Route2`.`order`
FROM
`routes` AS `Route`
INNER JOIN
`routes` AS `Route2`
ON `Route`.`route_id` = `Route2`.`route_id`
WHERE
`Route`.`station_line_id` IN ([10 values]) AND
`Route2`.`station_line_id` IN ([10 values]) AND
`Route`.`order` <= `Route2`.`order`
GROUP BY `
`Route`.`station_line_id`, `Route2`.`station_line_id`, (`Route2`.`order` - `Route`.`order`)
und ich habe alle Spalten indiziert (route_id, station_line_id, STATION_ID und line_id), mit der ID-Spalte erzeugt nur schreibgeschützt, wenn der Primärschlüssel (die Tabelle ist, also keine Sorge, alles zu indexieren). Die [10 values]
in der IN() -Klausel sind Komma getrennt, wie: IN(1, 2, ..., 10)
.
Grundsätzlich schließe ich mich selbst der Tabelle Routen Tabelle und gruppieren die Ergebnisse, um die gewünschten Datensätze zu erhalten. Die anderen Verknüpfungen werden zum Abrufen zugehöriger Daten verwendet.
Leistung, mit InnoDB Speicher-Engine, führe ich eine ähnliche Abfrage in> 30 Sekunden. Mit MyISAM bekomme ich> 5 Sekunden. Aber ich glaube, Ergebnisse können noch schneller abgerufen werden. Ich habe ~ 4,5 Millionen Datensätze in der Tabelle.
vorsichtig formatieren Sie Ihre Abfrage ein wenig? –
Ich habe meine Frage bearbeitet, sorry. – linkyndy
Sind das 10 Werte: 'IN (1,3,47, ... 89)' oder 'IN (SELECT Spalte FROM Tabelle)'? –