Ver Mensaje Individual
  #3 (permalink)  
Antiguo 27/03/2011, 16:58
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: 16 años, 5 meses
Puntos: 2658
Respuesta: SELECT (consulta) ¿pesada?

Tu consulta es así:
Código MySQL:
Ver original
  1. FROM foro
  2.     puntuacion>1 AND
  3.     date >= '$dateoneweekago' AND
  4.     (campo1='$ratio1' OR
  5.     campo1='$ratio2' OR
  6.     campo1='$ratio3' OR
  7.     campo2='$ratio1' OR
  8.     campo2='$ratio2' OR
  9.     campo2='$ratio3')
  10. ORDER BY puntuacion DESC
  11. LIMIT 25;
Respondiendo tus preguntas:
1) El orden de resolución de los AND es el mismo de aparición, normalmente, con algunas excepciones, como las subconsultas en el WHERE. Pero de todos modos la cadena de ANDs debe dar TRUE completa para que haya resultados.
Los OR anidados, por su parte, puede que se ejecuten todos o no. Como sólo se necesita uno TRUE, con el primero que se da el resto de la condición no necesita evaluarse.
2) Las eficiencia de las condiciones es relativa. Condiciones de tipo ">", "<", ">=", "<=", no suelen ser eficientes porque pueden implicar revisar la mayoría de la tabla, con lo que puede dar lugar a que descarte índices posibles y lea todo... con la consiguiente recarga de recursos.
En este tipo de casos suele ser práctico establecer índices sobre los campos del WHERE. En ocasiones la diferencia de performance es enorme.

Tips finales:
- Cuidado con el uso de palabras reservadas como nombres de campo, como es el caso de "date". No uses palabras que puedas ser nombres de función, cláusulas o tipos de dato. Te pueden generar errores indetectables.
- Cuidado con los ID: Si la tabla foros tiene un ID autonumérico, la cláusula DISTINCT no producirá ningún efecto.
- Si los campos son numéricos, no pongas los valores de las variables entre apóstrofes, eso sólo es válido para las cadenas de texto, fechas y horas. En los valores numéricos obligas al sistema a hacer una conversión implícita, que en consultas masivas afecta la performance.

Otra sintaxis:
Código MySQL:
Ver original
  1. FROM foro
  2.     puntuacion>1 AND
  3.     `date` >= '$dateoneweekago' AND
  4.     (campo1 IN ('$ratio1', '$ratio2', '$ratio3') OR campo2 IN('$ratio1', '$ratio2',  '$ratio3'))
  5. ORDER BY puntuacion DESC
  6. LIMIT 25;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)