ich diese Abfrage mit allen Mitarbeitern der {Kunden mit Namen mit Klein Start "a"} erhalten:MySQL - wie Index verwendet in WHERE x IN (<subquery>)
SELECT * FROM employees
WHERE client_id IN (SELECT id FROM clients WHERE name LIKE 'a%')
Spalte employees.client_id
eine ist int, mit INDEX client_id (index_id)
. Die Unterabfrage sollte IMHO eine Liste von ID-s zurückgeben, die dann in der WHERE-Klausel verwendet wird.
Bei der Abfrage EXPLAIN
verwendet die primäre Abfrage keine Indizes (type:ALL
). Aber wenn ich EXPLAIN
eine Liste aus der Unterabfrage (z. B. SELECT ... WHERE client_id IN (121,184,501)
), die EXPLAIN
wechselt zu type:range
, und diese Abfrage wird um 50% schneller.
Wie kann ich sicherstellen, dass die Abfrage den Index für die von der Unterabfrage zurückgegebenen Daten verwendet - oder gibt es eine effizientere Methode zum Abrufen dieser Daten? (Das Abrufen der ID-Liste zum Anwendungsserver, das Verbinden und Senden einer zweiten Abfrage ist hier noch teurer).
Vielen Dank im Voraus.
Konnte auch INNER JOIN-Syntax verwenden. – MarkR
Ich habe Fälle gesehen, in denen der Abfrageoptimierer wirklich falsch ist, und eine Unterabfrage zur Rückgabe von IDs wurde schneller geladen. Aber es war ein wirklich spezifischer Fall. Siehe: http://www.benlumley.co.uk/2008/06/25/mysql-query-optimizer-left-lacking/ wenn Sie an Details interessiert sind. – benlumley