Warum MySQL nicht den Index für diese Unterabfrage?
-
08-07-2019 - |
Frage
Früher habe ich dies zu tun:
SELECT layerID
FROM layers
WHERE ownerID = ?
AND collectionID = ?
Welche würde mir eine Reihe von layerID ist, und dann würde ich Schleife und tun dies für jeden einzelnen:
SELECT DATA
FROM drawings
WHERE layerID = ?
Und alles hat gut funktioniert. So, jetzt versuche ich es in einem Schritt zu tun, so dass ich versuche Sie dies:
SELECT DATA , layerID
FROM drawings
WHERE layerID = ANY (
SELECT layerID
FROM layers
WHERE ownerID = ?
AND collectionID = ?
)
Aber aus irgendeinem Grund, es nicht den Index verwenden, für die Hauptabfrage, SELECT DATA etc
! Also das eine kombinierte Abfrage dauert viel viel mehr Zeit in Anspruch, im Vergleich zu den einzelnen Abfragen ich vorher tat. (Von theway, die Unterabfrage, SELECT layerID etc
noch verwendet den Index).
ich festgestellt haben, wenn es eine Abfrage oder nicht mithilfe der ‚erklären‘ Erklärung der verwendet wird.
Ich habe einzelne Indizes für die ownerID
und collectionID
Spalten in der layers
Tabelle und auf der layerID
Spalte in der Tabelle drawings
.
Was bin ich falsch mit meiner Anfrage zu tun?
Lösung
Versuchen Sie eine Verknüpfung. ANY Ende sieht viel wie eine unoptimizable UNION zu den Abfrage-Optimierer.
SELECT d.DATA, d.layerID
FROM drawings AS d
INNER JOIN layers AS l ON d.layerID = l.layerID
WHERE l.ownerID = ? AND l.collectionID = ?
Andere Tipps
Ich habe noch nie das Schlüsselwort ANY gesehen, aber wenn Sie versuchen,
SELECT DATA , layerID FROM drawings WHERE layerID IN ( SELECT layerID FROM layers WHERE ownerID = ? AND collectionID = ? )
Wille, der das gleiche Problem? Ich glaube, es sollte nicht. Allerdings ist die INNER JOIN ist wahrscheinlich ein bisschen besser.