No es lo mismo esto:
Código MySQL:
Ver originalFROM articulo main
, articulo_detalle artd
WHERE main.id
=artd.id_articulo
AND main.id_empresa
='5523' AND main.referencia
='06b63fa08a306564e8ea56574...'
Que hacer
Código MySQL:
Ver originalWHERE main.id_empresa
='5523' AND main.referencia
='06b63fa08a306564e8ea56574...'
No es lo mismo revisar lo que lee con una sola tabla que con un JOIN. SUpongo que no esperarás en ese contexto que lea
la misma cantidad de registros.
Por otro lado, no nos estás mostrando el resultado completo del EXPLAIN, el que contiene mucha más información que simplemente la cantidad de registros accedidos.
Finalmente, los JOIN implícitos, con la condición en el WHERE son de muy mala performance. Es preferible hacer JIN explícitos, del tipo:
Código MySQL:
Ver original AND main.id_empresa
= 5523 AND main.referencia
='06b63fa08a306564e8ea56574...'
Además, como tal vez notes, no es buena práctica realizar comparaciones de campos numéricos contra valores tratados como cadenas.
Me refiero específicamente a esto:
Si id_empresa es un campo numérico
no se debe poner el valor a comparar entre apóstrofes, porque eso genera una conversión implicita en MySQL que a la larga hace perder performance, y además oculta errores de variables en programación, porque por ejemplo si ese valor ingresara vacío quedaría así
y eso sería producto de un error de programación, pero no dispararía ningún error, como debiera suceder, por ende tendrías un defecto de programación oculto e indetectado... hasta que se produjera un fallo catastrófico.
Finalmente, indexar por 8 caracteres, cuando tienes una cadena de 60... es una muy mala idea. La cantidad de coincidencias podría ser elevadísima, y jamás lo sabrías a menos que revisases con cuidado la base.