2010-07-19 5 views
7

Tengo una consulta que se puede expresar de 2 maneras diferentes con los mismos resultados. ¿Cuál es mejor, por rendimiento u otras razones?¿Cuál consulta de fecha mySQL tiene mejor rendimiento?

Primera consulta:

SELECT post_id FROM posts 
    WHERE post_date BETWEEN '2010-01-01 00:00:00' AND '2010-12-31 23:59:59' 

Segunda consulta:

SELECT post_id FROM posts 
    WHERE YEAR(post_date)=2010 

Gracias de antemano.


Después de la sugerencia para la evaluación comparativa He tenido algunas búsquedas y pruebas. Mis pruebas no fueron puntos de referencia debido a algunos problemas en mi computadora, pero me dieron una idea.

He probado mi mesa de remo 4000 y no hubo una diferencia importante. BETWEEN fue más de 0.01-0.02 segundos que AÑO (post_date) en 0.09 tiempo de consulta total. Parece que usar AÑO (post_date) sería bueno tanto para el rendimiento como para la usabilidad.

Y he aprendido eso mientras búsquedas; si las horas o minutos no son tan importantes, ENTRE podría ser utilizado como esto:

SELECT post_id FROM posts 
    WHERE post_date BETWEEN '2010-01-01' AND '2010-12-31' 
+6

¿por qué no lo comparas tú mismo? – dbemerlin

+0

Advertencia: 'BETWEEN '2010-01-01' AND '2010-12-31'' hace algo * levemente * sorprendente: no incluye el último día, ya que está internamente expandido a' BETWEEN '2010-01-01 00 : 00: 00 'Y' 2010-12-31 00: 00: 00'' – Piskvor

+1

@dbemerlin: Porque entonces otros (como yo) pueden venir y ver las respuestas y los resultados de los demás. –

Respuesta

8

Si tiene un índice en post_date (que recomiendo si desea ejecutar esta consulta a menudo), entonces la consulta BETWEENcan use it. Una vez que coloca una columna en una función (YEAR(post_date)), MySQL ya no utiliza el índice de la columna, por lo que tiene que pasar por todas las filas (que se llama full table scan).

Consulte la salida de EXPLAIN SELECT con sus consultas (check this tutorial) y vea los resultados que obtendrá: si hay un índice utilizable, debería ver la diferencia claramente.

Por supuesto, compare su código y compruébelo usted mismo, pero en general, use las funciones en DONDE es más lento.

+0

gracias Piskvor. He tenido alguna búsqueda y he editado mi pregunta. FYI – Kemal

+0

De nada. En 4000 filas, la diferencia es realmente irrelevante. – Piskvor

2

Usted puede utilizar el perfilador consulta para ver exactamente cuánto tiempo cada uno toma:

http://dev.mysql.com/tech-resources/articles/using-new-query-profiler.html

que es exacta , por supuesto, querrá probar cada uno varias veces y asegurarse de que no se esté ejecutando nada más en el sistema.

Asegúrese de volver aquí con su respuesta :)

+0

gracias David. He tenido alguna búsqueda y he editado mi pregunta. FYI – Kemal

0

Estoy de acuerdo con los otros carteles - simplemente probarlo, ya que tienes ambas consultas disponibles. No hay mejor prueba que eso.

Si tuviera que adivinar (lo cual es siempre una mala idea) que es más rápido, diría que si post_date está indexado, entonces el primero sería más rápido ya que puede usar el índice para recuperar las filas correspondientes . Si no hay un índice, entonces cualquier diferencia entre los dos será marginal.

+0

Gracias por responder mdma – Kemal

1

Como dicen los demás, usted mismo puede medir el rendimiento relativo.

SELECT post_id FROM posts WHERE YEAR(post_date)=2010 

es mucho más legible que el otro, y a menos que el rendimiento sea un problema, yo siempre iría con eso.

+1

Buen punto: legible, pero escala no; por encima de unos pocos miles de filas, problemas de rendimiento que pueda tener;) – Piskvor

+0

Creo que también elegiría esto^_ ^ – Kemal

Cuestiones relacionadas