2008-08-29 17 views
24

¿Limitar una consulta a un registro de resultados, mejorar el rendimiento en una tabla MySQL grande (ish) si la tabla solo tiene un resultado coincidente?¿Limitar una consulta a un registro mejora el rendimiento?

por ejemplo

select * from people where name = "Re0sless" limit 1 

si sólo hay un registro con ese nombre? y ¿qué pasa si name fue la clave principal/establecido como único? ¿Vale la pena actualizar la consulta o la ganancia será mínima?

Respuesta

35

Si la columna tiene

un índice único: no, no es más rápido

un índice no único: tal vez, porque va a impedir el envío de las filas adicionales más allá de la primera emparejado, si existe alguno

ningún índice: a veces

  • si 1 o más filas coinciden con la consulta, , porque la exploración de la tabla completa se detendrá después de que coincida la primera fila.
  • si no hay filas coincide con la consulta, sin, ya que tendrá que completar una mesa de exploración completa del
+2

¿Evitará una exploración completa de la tabla o hará que la exploración completa de la tabla se detenga antes de tiempo? Si el registro no está allí, aún tendrá que hacer un escaneo completo y completo de la tabla. –

+2

Sí, tienes razón. Debería haber dicho que "puede" evitar una exploración completa de la tabla. Ajustaré la publicación –

+4

Lo importante aquí, tal como lo entiendo, es que agregar el límite puede hacer que su consulta sea más rápida, pero no la hará más lenta. Si nada más, también sirve para telegrafiar claramente su intención a los futuros desarrolladores, en caso de que tengan que depurar una situación en la que sus condiciones no fueran tan únicas como pensaba que eran. Hago un hábito de agregar siempre una cláusula de límite cada vez que tengo un solo resultado. Es solo un desperdicio de capacidad intelectual para averiguar si un índice preexistente ya lo hubiera hecho por usted. – GrandOpener

0

Creo que el LIMIT es algo que se hace después de que se encuentra el conjunto de datos y se está formando el conjunto de resultados, por lo que no esperaría que hiciera ninguna diferencia. Hacer nombre de la clave principal tendrá un efecto positivo significativo, ya que dará como resultado un índice para la columna.

0

Si "nombre" es único en la tabla, a continuación, todavía puede haber una (muy muy mínimo) gana en rendimiento poniendo la restricción de límite en tu consulta. Si el nombre es la clave principal, probablemente no habrá ninguna.

2

Para responder a sus preguntas en orden: 1) sí, si no hay índice en el nombre. La consulta terminará tan pronto como encuentre el primer registro. quítese el límite y tiene que hacer un escaneo completo de la tabla cada vez. 2) no. las llaves primarias/únicas tienen la garantía de ser únicas. La consulta debería dejar de ejecutarse tan pronto como encuentre la fila.

0

Sí, notará una diferencia de rendimiento al tratar con los datos. Un registro ocupa menos espacio que múltiples registros. A menos que trabaje con muchas filas, esto no supondría una gran diferencia, pero una vez que ejecuta la consulta, los datos tienen que volver a mostrarse, lo cual es costoso o se trata programáticamente. De cualquier manera, un registro es más fácil que múltiple.

3

Si tiene una consulta un poco más complicada, con una o más uniones, la cláusula LIMIT proporciona al optimizador información adicional. Si espera unir dos tablas y devolver todas las filas, generalmente es óptimo un hash join. Una combinación de hash es un tipo de unión optimizada para grandes cantidades de coincidencia.

Ahora, si el optimizador sabe que ha pasado LIMIT 1, sabe que no procesará grandes cantidades de datos. Puede revertir a loop join.

Según la base de datos (e incluso la versión de la base de datos), esto puede tener un gran impacto en el rendimiento.

Cuestiones relacionadas