Pregunta

No recibo ningún error como tal, solo un problema menor de rendimiento.

EXPLAIN
SELECT
a.nid,
a.title,
a.uid,
b.parent,
b.weight,
c.name,
d.value
FROM table1 AS a INNER JOIN table2 AS b ON a.vid = b.vid AND a.status = 1
INNER JOIN table3 AS c ON c.uid = a.uid
INNER JOIN table4 AS d ON d.content_id = a.nid AND d.value_type = 'percent' AND d.function = 'average'

Cuando veo en qué tablas se hace referencia, todo está bien, pero desde la tabla 4, donde solo debería estar seleccionando el valor " " campo, estoy recibiendo un TODO llamado ...

id  select_type     table   type      possible_keys                                   key     key_len   ref                   rows  Extra
1   SIMPLE          a     ref     PRIMARY,vid,status,uid,node_status_type,nid   status  4         const                 1    
1   SIMPLE          b     eq_ref    PRIMARY                                         PRIMARY 4         databasename.a.vid    1    
1   SIMPLE          c     eq_ref    PRIMARY                                         PRIMARY 4         databasename.a.uid    1   Using where
1   SIMPLE          d     ALL     NULL                                          NULL      NULL      NULL                  2     Using where

Como puede ver, está seleccionando * de la tabla final (d). ¿Por qué está haciendo esto cuando solo necesito UN campo seleccionado de él? ¿Alguien puede ayudarme?

¿Fue útil?

Solución

ALL significa todas las filas, no todas las columnas. Como dice que no hay claves posibles, supongo que no tiene un índice en d.content_id o d.value_type o d.function.

Si desea ser elegante, puede colocar un índice en las 3 columnas.

Otros consejos

¿Los campos d.value_type y d.function están indexados? Ese sería el instinto inicial en cuanto a la causa.

Agregue un índice de varias columnas a table4 basado en las columnas content_type , value_type y function .

Su consulta no está seleccionando todas las columnas de table4 , está seleccionando todas las filas; esto no es un gran problema cuando solo hay dos.

Tenga en cuenta que un plan de ejecución de consultas de MySQL podría no dar la respuesta que espera cuando está trabajando con una pequeña cantidad de registros; puede ser más rápido para la base de datos realizar una exploración completa de la tabla en esas circunstancias.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top