MySQL - Simplificación de consulta

 
Vista:
sin imagen de perfil
Val: 2
Ha aumentado su posición en 35 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Simplificación de consulta

Publicado por Juan (2 intervenciones) el 20/06/2018 21:33:44
Hola a todos.

Llevo poco tiempo programando en php y mysql y tengo una consulta que tarda bastante tiempo en ejecutarse. Me gustaría saber si se podría simplificar de alguna forma para que sea más rapida. La consulta en cuestión es:

SELECT DISTINCTROW Genero,Filum FROM listadototal WHERE (foto=1 OR ficha=1 OR geo=1 OR relaciones=1) AND status='1' AND Genero NOT IN (SELECT Genero FROM clasificacion) ORDER BY Filum,Genero;


Agradezco vuestra ayuda

Un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Simplificación de consulta

Publicado por leonardo_josue (414 intervenciones) el 21/06/2018 17:15:42
Hola Juan:

Hablar de consultas tardadas puede ser muy subjetivo en Base de Datos: ¿De cuánto tiempo estamos hablando para que se ejecute la consulta?

Hay muchos factores que pueden afectar el rendimiento de un SELECT, como el número de registros en la tabla, la configuración del servidor y un largo etcétera. Pero veamos algunas cosas que igual te pueden servir.

De entrada, debes evitar el uso de la cláusula IN ya que esta es una de las peores maneras de filtrar información por su lento performance. Para hacer esto mismo, la mejor forma de hacerlo es con un INNER JOIN:

1
2
3
4
5
6
7
8
9
10
SELECT DISTINCTROW Genero, Filum
FROM listadototal
INNER JOIN clasificacion ON clasificacion.genero = listadototal.genero
WHERE
  ( foto=1 OR
    ficha=1 OR
    geo=1 OR
    relaciones=1) AND
  status='1'
ORDER BY Filum, Genero;

Revisa también que tengas un correcto uso de índices, tanto para los campos que intervienen en el JOIN , así como por los que estás filtrado y sobre todo para los campos que estás ordenando

Si fuera posible, evita la cláusula ORDER BY, ya que esta es la operación más lenta en el SELECT.

Si continuas con problemas, revisa el plan de ejecución de tu consulta y muestra los resultados, para ver qué recomendaciones te podemos hacer:

https://dev.mysql.com/doc/refman/8.0/en/explain.html

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar