Ver Mensaje Individual
  #2 (permalink)  
Antiguo 11/01/2014, 10:05
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 9 meses
Puntos: 2658
Respuesta: Consulta con indices

No es lo mismo esto:
Código MySQL:
Ver original
  1. SELECT ...
  2. FROM articulo main, articulo_detalle artd
  3. WHERE main.id=artd.id_articulo
  4.     AND main.id_empresa='5523'
  5.     AND main.referencia='06b63fa08a306564e8ea56574...'
Que hacer
Código MySQL:
Ver original
  1. SELECT ...
  2. FROM articulo main
  3. WHERE main.id_empresa='5523'
  4.     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
  1. SELECT ...
  2. FROM articulo A INNER JOIN articulo_detalle D ON A.id = D.id_articulo
  3.     AND main.id_empresa = 5523
  4.     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:
Código MySQL:
Ver original
  1. AND main.id_empresa='5523'
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í
Código MySQL:
Ver original
  1. AND main.id_empresa=''
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.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)