Ver Mensaje Individual
  #2 (permalink)  
Antiguo 21/06/2010, 15:01
jurena
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
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.