Ver Mensaje Individual
  #4 (permalink)  
Antiguo 06/01/2010, 11:16
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, 1 mes
Puntos: 2658
Respuesta: Como Obtimizar esta Consulta?

Dos de las cláusulas que hay que evitar en lo posible en estos casos son GROUP BY y ORDER BY, ya que son las mayores consumidoras de recursos.
En tu caso la exterior no se puede evitar, pero si la de la subconsulta, ya que carece completamente de utilidad, cuando ya existe una más eficiente.
Esto sería una posibilidad:
Código MySQL:
Ver original
  1.   T1.ip_publica AS ip,
  2.   T2.*,
  3.   T2.country_name pais,
  4.   COUNT(T2.country_name) AS total
  5.   (SELECT DISTINCT ip_publica FROM stat_user) T1 LEFT JOIN stat_country T2
  6.     ON INET_ATON(T1.ip_publica)>=T2.IP_FROM AND INET_ATON(T1.ip_publica)<=T2.IP_TO
  7.   GROUP BY pais
  8.   ORDER BY total DESC LIMIT 0,10
Aún así, dos de las columnas pedidas son virtualmente inutiles, si estás agrupando por valores que ocultarán datos o los simplificarán. Esto es, T1.ip_publica y T2.*, serán absorbidos por el agrupamiento. En todo caso habría que ver si realmente necesitas todos los campos de la tabla stat_country (eso no se puede apreciar, porque no se sabe qué campos tiene).
Tal vez esto sea suficiente:
Código MySQL:
Ver original
  1.   T2.country_name pais,
  2.   COUNT(T2.country_name) total
  3.   (SELECT DISTINCT ip_publica FROM stat_user) T1 LEFT JOIN stat_country T2
  4.     ON INET_ATON(T1.ip_publica)>=T2.IP_FROM AND INET_ATON(T1.ip_publica)<=T2.IP_TO
  5.   GROUP BY pais
  6.   ORDER BY total DESC LIMIT 0,10;
Lo que yo haría es esto, para obtener sólo la info de los países que forman parte del resultado:
Código MySQL:
Ver original
  1. SELECT T4.*, total
  2.   T2.country_name pais,
  3.   COUNT(T2.country_name) total
  4.   (SELECT DISTINCT ip_publica FROM stat_user) T1 LEFT JOIN (SELECT IP_FROM, IP_TO FROM stat_country) T2
  5.     ON INET_ATON(T1.ip_publica)>=T2.IP_FROM AND INET_ATON(T1.ip_publica)<=T2.IP_TO
  6.   GROUP BY pais)) T4
  7.   INNER JOIN stat_country S ON pais = D.country_name
  8. LIMIT 0,10
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)