Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Velocidad en ejecución de consulta SQL

Estas en el tema de Velocidad en ejecución de consulta SQL en el foro de Mysql en Foros del Web. Hola... espero se encuentren bien. Hoy tengo una pequeña duda y espero alguien pueda ayudarme... Resulta que tengo una consulta que dándole un order by ...
  #1 (permalink)  
Antiguo 21/06/2010, 14:07
 
Fecha de Ingreso: noviembre-2008
Mensajes: 89
Antigüedad: 9 años, 8 meses
Puntos: 0
De acuerdo Velocidad en ejecución de consulta SQL

Hola... espero se encuentren bien.

Hoy tengo una pequeña duda y espero alguien pueda ayudarme...

Resulta que tengo una consulta que dándole un order by se coloca lenta y a veces hasta el mismo motor interrumpe la consulta porque demora mucho. Pero al quitarle el order by Corre de maravilla..... Pero el dilema es que necesito ordenarla... Bueno aquí más o menos como es mi consulta:

Código:
SELECT DISTINCT (e.CodEstudiante ) FROM Tabla1 AS e, Tabla2 AS nm, Tabla3 AS m WHERE e.Campo1 = '18' AND DATE_FORMAT( nm.Fecha, '%m' ) = '06' AND DATE_FORMAT( nm.Fecha, '%Y' ) = '2010' AND e.CodEstudiante NOT IN ( SELECT es.CodEstudiante FROM `Tabla1` AS es, Tabla2 AS nm, Tabla3 AS m WHERE es.GradoEstudiante = '18' AND nm.IdPeriodo='5' AND nm.CodEstudiante = es.CodEstudiante AND m.IdMateria = nm.IdMateria AND nm.IdMateria = '239')   order by e.Apellidos limit 1;
Al final antes de limit 1 si le quito que me ordene... hace la consulta volando, pero si le coloco el order by se pone muy lento... Por qué será ? Alguién tiene idea de lo que pueda pasar?


Gracias....

Edito: Estoy ordenando por un campo de texto... No se si esto tenga que ver. Aunque al colocarle limit 1, debería rápida la consulta, no?

Última edición por ingeday; 21/06/2010 a las 14:12
  #2 (permalink)  
Antiguo 21/06/2010, 15:01
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 10 años, 4 meses
Puntos: 300
Respuesta: Velocidad en ejecución de consulta SQL

Cita:
SELECT DISTINCT (e.CodEstudiante ) FROM Tabla1 AS e, Tabla2 AS nm, Tabla3 AS m WHERE e.Campo1 = '18' AND DATE_FORMAT( nm.Fecha, '%m' ) = '06' AND DATE_FORMAT( nm.Fecha, '%Y' ) = '2010' AND e.CodEstudiante NOT IN ( SELECT es.CodEstudiante FROM `Tabla1` AS es, Tabla2 AS nm, Tabla3 AS m WHERE es.GradoEstudiante = '18' AND nm.IdPeriodo='5' AND nm.CodEstudiante = es.CodEstudiante AND m.IdMateria = nm.IdMateria AND nm.IdMateria = '239') order by e.Apellidos limit 1;
Esta consulta no me gusta nada. Estás uniendo todos los datos de tres tablas sin relacionarlas por ningún campo; eso lo haces dos veces, una de ellas en una subconsulta. Haces una consulta de mes y año, y no usas la funciones MONTH ni YEAR, sino dos veces DATE_FORMAT(); usas NOT IN, aunque podrías haber utilizado LEFT JOIN; ordenas por apellidos, sin tener cargado en el select los apellidos; añades comillas a los campos numéricos que buscas; no nos dices los índices que usas; no sabemos si realmente es necesario ese DISTINCT, etc.
Pero lo que más me preocupa es que no veo cómo se relacionan esas tres tablas, y tampoco si están indexados los campos por los que se relacionan (en caso de que sean FK; los PK están indexados siempre) y los campos sobre los que realizas búsquedas con WHERE.
Responde a estas cuestiones en la medida en que puedas, y podremos ayudarte mejor.
Respecto a lo último que preguntas, antes de hacer el corte de limit ordena según el criterio que le pides. Según creo, primero ordena y luego limita; por lo que parece que tiene que ordenar todo.

Etiquetas: sql, velocidad
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:58.