¿Agregar 'LIMIT 1' a las consultas MySQL las hace más rápidas cuando sabe que solo habrá 1 resultado?

86

Cuando agrego LIMIT 1 a una consulta MySQL, ¿detiene la búsqueda después de encontrar 1 resultado (lo que la hace más rápida) o aún obtiene todos los resultados y se trunca al final?

Logan Serman
fuente
1
No si hay una UNIQUE(o PRIMARY KEY) restricción (o índice) en la columna del filtro. stackoverflow.com/questions/8467092/…
ma11hew28

Respuestas:

81

Dependiendo de la consulta, agregar una cláusula de límite puede tener un efecto enorme en el rendimiento. Si desea solo una fila (o sabe con certeza que solo una fila puede satisfacer la consulta) y no está seguro de cómo la ejecutará el optimizador interno (por ejemplo, la cláusula WHERE no golpea un índice, etc.), entonces definitivamente debería agregar una cláusula LIMIT.

En cuanto a las consultas optimizadas (usando índices en tablas pequeñas), probablemente no importará mucho en el rendimiento, pero de nuevo, si solo está interesado en una fila, agregue una cláusula LIMIT independientemente.

Eran Galperin
fuente
30
Para propósitos anti-fraude, es posible que desee considerar enviar LIMIT 2 y luego quejarse o bombardear si su suposición de una sola fila no se cumple.
Jeffrey Hantin
6
@JeffreyHantin Si realmente puede haber solo uno, debería preferir agregar una restricción única a la base de datos. Mucho más limpio que estropear tu código con controles de cordura.
Cristian Vrabie
@CristianVrabie Si se puede expresar como una restricción única, claro, pero esa es una afirmación sobre los datos en las tablas. Enviar LIMIT 2 y verificar 1 es una afirmación sobre la consulta en sí, que muy bien puede contener un error como una condición de unión especificada de manera inadecuada.
Jeffrey Hantin
1
@JeffreyHantin Muy bien, pero excepto si codificas para el Mars Rover, escribes pruebas para esto en lugar de contaminar tu código.
Cristian Vrabie
8
@JeffreyHantin Si la suposición de que solo hay una es correcta, ¿agregar LIMIT 2 no eliminaría ninguna optimización, ya que buscaría en todas las filas? Agregar LIMIT 2 en ese caso no es mejor (en términos de optimización) que no agregar nada en absoluto.
Chris Middleton
19

El límite puede afectar el rendimiento de la consulta (consulte los comentarios y el enlace a continuación) y también reduce el conjunto de resultados que genera MySQL. Para una consulta en la que espera un único resultado, hay beneficios.

Además, limitar el conjunto de resultados puede, de hecho, acelerar el tiempo total de consulta, ya que la transferencia de conjuntos de resultados grandes utiliza memoria y puede crear tablas temporales en el disco. Menciono esto porque vi recientemente una aplicación que no usaba limit kill a un servidor debido a enormes conjuntos de resultados y con el límite establecido, la utilización de recursos se redujo enormemente.

Consulte esta página para obtener más detalles: Documentación de MySQL: Optimización LIMIT

rjamestaylor
fuente
La página que vinculó dice: "Si está seleccionando solo unas pocas filas con LIMIT, MySQL usa índices en algunos casos cuando normalmente preferiría hacer un escaneo completo de la tabla". Eso no parece que la consulta en sí se procese siempre como de costumbre.
che
buen punto. Estaba haciendo una generalización basada en las observaciones del uso de EXPLAIN. Gracias por la captura.
rjamestaylor
Se agradece mucho el enlace. FWIW, la mayor parte de esta respuesta parece aplicarse a situaciones en las que, sin Límite, podría haber un gran conjunto de resultados . La pregunta es si importa si solo una fila coincidirá con éxito; en cuyo caso el "conjunto de resultados" es solo 1 fila (incluso sin límite).
ToolmakerSteve
5

Si solo se obtiene 1 resultado, entonces no, LIMIT no lo hará más rápido. Si hay muchos resultados, y solo necesita el primer resultado, y no hay declaraciones GROUP u ORDER by, LIMIT lo hará más rápido.

Kris Erickson
fuente
2
Debería ser más rápido incluso con 1 fila, si no hay claves únicas / primarias, porque deja de buscar después de que encuentra la primera aparición
the_nuts
Kris, tu primera oración se puede leer de dos maneras. Si quiere decir "sólo se podría devolver 1 fila" (por ejemplo, al consultar una columna única), entonces lo que dice es cierto. OTOH, si te refieres a "siempre que solo se encuentre 1 resultado coincidente", el límite no lo hará más rápido: ¿estás seguro? ¿No evita en ocasiones tener que extraer páginas adicionales?
ToolmakerSteve
5

La respuesta, en definitiva, es sí. Si limita su resultado a 1, incluso si está "esperando" un resultado, la consulta será más rápida porque su base de datos no revisará todos sus registros. Simplemente se detendrá una vez que encuentre un registro que coincida con su consulta.

Max Alexander Hanna
fuente
1
Esta respuesta es engañosa, porque carece de la advertencia que se ve en los comentarios de otras respuestas (¡7 años antes!) De que si la base de datos sabe que solo un registro puede coincidir (por ejemplo, al consultar una columna única), el límite 1 no tendrá ningún efecto.
ToolmakerSteve
¿Seriamente? El optimizador de consultas puede aprovechar el hecho de que determinadas condiciones garantizan que solo se pueda devolver 1 registro. Estaba señalando que su respuesta no es correcta en todas las circunstancias. (Y, por lo tanto, resta valor a lo que ya se dijo años antes). Si está de acuerdo, podría reconocer la exactitud de mi comentario. Si no está de acuerdo, podría aclarar por qué.
ToolmakerSteve
1

Si realmente solo espera un resultado único, realmente tiene sentido agregar el LÍMITE a su consulta. No conozco el funcionamiento interno de MySQL, pero estoy seguro de que no recopilará un conjunto de resultados de más de 100.000 registros solo para truncarlo de nuevo a 1 al final.

drian
fuente