Ver Mensaje Individual
  #2 (permalink)  
Antiguo 25/11/2012, 09:20
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: 17 años, 4 meses
Puntos: 2658
Respuesta: Optimizar consulta SELECT MySql

Por lo pronto, el uso de ORDER BY y GROUP BY es por definición ineficiente en cualquier DMS, sea o no MySQL.
Pero además hay dos cosas: si haces una subconsulta sobre el mismo campo que ya identifica el mensaje, referido a otra tabla, se infiere que hay una relación entre ambas (especialmente si una se llama "mensajes" y la otra "destinatiarios".
En ese caso deberías estar usado un JOIN y no una subconsulta.
Si a esto le agregamos que todo mensaje debería tener obligatoriamente un destinatario, entonces la consulta si o si debería ser INNER JOIN.
Así pues, por empezar la consulta debería andar por acá:
Código MySQL:
Ver original
  1. FROM `mensajes` M INNER JOIN `destinatarios` D ON M.mensajeID = D.mensajeID
  2.     M.fromID='".$_SESSION['MyID']."'
  3.     AND D.ToID=".$_SESSION[MyID]."
  4. LIMIT 200
Respecto al ordenamiento, el único modo de mejorarlo es creando un indice sobre el campo o campos invocados en el ORDER BY.

Hay, sí, un error severo: NO debes utilizar nombres como "datetime" para las columnas, porque son palabras reservadas. Las palabras reservadas pueden generar errores sintácticos indetectables, desde el momento en que son parte del SQL (en ese cso es un tipo de dato).

Otra cosa que se infiere es que podría existir un error de diseño de la base, que también conspira contra la performance, desde que si existe un mensaje, el destinatario debe ser un atributo del mensaje (el destinatario es del mensaje emitido, como también el remitente), y el destinatario debería ser un usuario, o un contacto del usuario.
En ese contexto hay dos tres posibilidades:
1) Si es un usuario del sistema, tanto el ID del destinatario como del remitente apuntan a la misma tabla (2 FK distintas a la misma tabla), pero requiere una tabla Mensajes_Destinatarios con dos campos (es tabla relacional).
2) Es un contacto no perteneciente al sistema sino al usuario. Requiere de una tabla de Contactos, una tabla Mensajes_Destinatarios y otra de Mensajes_Contactos.

Tengo la impresión de que a tu sistema le esta faltando algo... o no quedan clara las relaciones, y eso afectará la performance de todas las consultas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)