¿Por qué MySQL no usa el índice para esta subconsulta?
-
08-07-2019 - |
Pregunta
Solía ??hacer esto:
SELECT layerID
FROM layers
WHERE ownerID = ?
AND collectionID = ?
Lo que me daría una matriz de layerID, y luego haría un bucle y haría esto para cada uno:
SELECT DATA
FROM drawings
WHERE layerID = ?
Y todo funcionó bien. Así que ahora estoy tratando de hacerlo en un solo paso, así que intento esto:
SELECT DATA , layerID
FROM drawings
WHERE layerID = ANY (
SELECT layerID
FROM layers
WHERE ownerID = ?
AND collectionID = ?
)
¡Pero por alguna razón, no usa el índice, para la consulta principal, SELECT DATA, etc.
! Por lo tanto, esta consulta combinada tarda mucho más en completarse, en comparación con las consultas separadas que estaba haciendo antes. (Por cierto, la subconsulta, SELECT layerID, etc.
todavía usa el índice).
He determinado si está usando una consulta o no usando la declaración 'EXPLICAR'.
Tengo índices individuales en las columnas ownerID
y collectionID
en la tabla capas
, y en la layerID
columna en la tabla dibujos
.
¿Qué estoy haciendo mal con mi consulta?
Solución
Intenta unirte. CUALQUIER termina pareciéndose mucho a una UNIÓN no optimizable para el optimizador de consultas.
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 = ?
Otros consejos
Nunca antes había visto CUALQUIER palabra clave, pero si lo intentas
SELECT DATA , layerID FROM drawings WHERE layerID IN ( SELECT layerID FROM layers WHERE ownerID = ? AND collectionID = ? )
¿tendrá eso el mismo problema? Creo que no debería. Sin embargo, el INNER JOIN es probablemente un poco mejor.