mysql - ¿Se recomienda "LÍMITE 1" para consultas donde la condición DÓNDE se basa en PK?
mysql order by (2)
Estoy consultando una base de datos mySQL para recuperar los datos de 1 fila en particular. Estoy usando la clave principal de la tabla como el parámetro de restricción WHERE.
P.ej
SELECT name FROM users WHERE userid = 4
La columna userid es la clave principal de la tabla. ¿Es una buena práctica usar LIMIT 1 al final de esa declaración mySQL? ¿O hay algún beneficio de velocidad?
La columna userid es la clave principal de la tabla. ¿Es una buena práctica usar LIMIT 1 al final de esa declaración mySQL? ¿O hay algún beneficio de velocidad?
No es una buena práctica usar LIMIT 1
al final del ejemplo; es completamente innecesario, porque la columna de ID de usuario es una clave principal. Una clave principal significa que solo hay una fila / registro en la tabla con ese valor, solo se devolverá una fila / registro.
Pero el indicador final es el plan explicativo:
explain SELECT t.name FROM USERS t WHERE t.userid = 4
...devoluciones:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
-----------------------------------------------------------------------------------------------------
1 | SIMPLE | users | const | PRIMARY | PRIMARY | 4 | const | 1 |
...y:
explain SELECT t.name FROM USERS t WHERE t.userid = 4 LIMIT 1
...devoluciones:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
-----------------------------------------------------------------------------------------------------
1 | SIMPLE | users | const | PRIMARY | PRIMARY | 4 | const | 1 |
Conclusión
No hay diferencia, no hay necesidad. Parece estar optimizado en este caso (solo buscar contra la clave principal).
La cláusula LIMIT
El uso de LIMIT
sin ORDER BY
devolverá una fila / registro arbitrario si se devuelve más de uno. Por ejemplo, usando el escenario "John Smith" donde 2+ personas pueden tener el nombre "John Smith":
SELECT t.userid
FROM USERS t
WHERE t.first_name = ''John''
AND t.last_name = ''Smith''
LIMIT 1
... corre el riesgo de devolver cualquiera de los posibles valores de userid
donde el primer nombre es "John" y el apellido es "Smith". No se puede garantizar que siempre devuelva el mismo valor, y la probabilidad de obtener un valor diferente cada vez que aumenta con el número de registros posibles.
Personalmente no me importa el uso de LIMIT. La sintaxis no es compatible con Oracle, SQL Server o DB2, lo que hace que las consultas sean menos portátiles. LIMIT es una herramienta para usar de forma conservadora, no es lo primero que debe alcanzar: saber cuándo debe usar funciones agregadas y / o analíticas.
Yo llamaría a esto una mala práctica, ya que cuando se trata de algo como un userid
, generalmente es único y no tendrá más de uno. Por lo tanto, tener un LIMIT 1
parece bastante contradictorio y es posible que alguien que conserve su código más tarde tenga que adivinar su diseño.
Además, no creo que tenga ningún beneficio de velocidad. Puede consultar la explicación de mySQL para obtener una herramienta sencilla para analizar una consulta.
Tenga en cuenta, como se menciona en los comentarios. LIMIT #
tiene velocidad y beneficios generales en otros casos, pero no en este.