2012-07-04 18 views
5

¿Alguien sabe si hay alguna diferencia de velocidad (obviamente, para las tablas que son de suficiente tamaño) entre estas dos consultas:¿LÍMITE 0,1 acelerar un SELECCIONAR en una clave principal?

SELECT field FROM table WHERE primary_key = "a particular value" 

o:

SELECT field FROM table WHERE primary_key = "a particular value" LIMIT 0,1 

deben tener en cuenta que el campo primary_key es en realidad una clave principal.

Ahora LIMIT 0,1 ayuda cuando una consulta de otro modo continuaría para encontrar otras coincidencias. Sin embargo, supongo que cuando se trata de una clave principal, debe detenerse automáticamente debido a su singularidad. Así que mi conjetura es que no habría ninguna ganancia al agregarlo.

¿Alguien se encuentra con esto antes? No tengo un conjunto de datos lo suficientemente grande como para probarlo en este momento. También supondría que se aplicaría la misma respuesta para cualquier campo que se haya configurado para ser UNIQUE.

+5

Usted puede encontrar esta lectura útil: http://dev.mysql.com/doc/refman/5.0/en/explain-output.html#explain-join-types particularmente el título "explican unirse tipos " – Hammerite

Respuesta

6

Así que después de leer la información proporcionada por Hammerite (Gracias por eso) que se ejecuta explain en ambas consultas produce:

  • id = 1
  • SELECT_TYPE = sencilla tabla de
  • = mesa
  • type = CONST
  • possible_keys = PRIMARIO
  • clave = PRIMARIA
  • key_len = 767
  • ref = const
  • filas = 1
  • extra =

que identifica tanto las consultas como CONST, que el enlace define como:

const

La tabla tiene como máximo e la fila correspondiente, que se lee al inicio de la consulta. Como solo hay una fila, los valores de la columna en esta fila puede considerarse como constantes por el resto del optimizador. las tablas de const son muy rápidas porque se leen solo una vez.

Suponiendo que entiendo ambas consultas correctamente, se tratarán igual, que es lo que esperaba.

4

Las claves principales se buscarán como un índice que es bastante rápido.

Pero poner límites a sus consultas es parte de las mejores prácticas.

En cualquier consultas más complejas que lo hará, con Une, group_by y el orden o incluso búsquedas individuales, que permiten SQL para detener, después de que se encontró su row_count límites de registro, por ejemplo: 1

Si su uso para por, permitirá que sql inicie la búsqueda apropiadamente de la columna ordenada y se detenga después de que se encuentre 1 registro, incluso si se encuentran otros registros dentro de otras columnas o condiciones especificadas, por ejemplo:

SELECT Primary_keycoll,field2 FROM table WHERE Primary_keycoll = "value1" or field2 = 'value1' order by field2 limit 0,1 quizás Primary_keycoll es único pero otros, por ejemplo: field2 podría no, limitando a 1, permitir a mysql obtener el primero y detenerse, de lo contrario irá a través de todas las columnas o recursos especificados para asegurar otro col umns no cumplen con la consulta.

Usar el límite al final de la consulta es una buena práctica por razones de seguridad, ya que bloqueará algunos intentos de inyección de SQL. siempre que sus limitadores estén debidamente desinfectados.

http://dev.mysql.com/doc/refman/5.0/en/limit-optimization.html

+1

+1 Gracias por la información adicional :) - aunque soy consciente de que LIMIT siempre será de ayuda con respecto a las consultas más complejas (o no indexadas/no únicas). Y ahora, desde que hice esta pregunta, sé que los campos únicos se limitarán automáticamente por defecto ... Lo que no había pensado eran los posibles beneficios de implementar LIMIT como una ayuda contra la inyección de SQL ... eso es un buen punto. – Pebbl

+3

Información adicional: 'LIMIT 0' devolverá rápidamente un conjunto vacío. Esto se puede usar para verificar la validez de una consulta. Si la consulta es válida, no obtendrá un error; si no es válida, obtendrá una descripción del error. Se puede usar para verificar la sintaxis en grandes conjuntos de datos. – GuruJR

+1

+1 Creo que ya has argumentado lo suficiente que tiene sentido siempre usar LIMIT 0,1 si puedes ... y usar LIMIT 0 si deseas verificar la validez de una consulta. buenos puntos. – Pebbl

Cuestiones relacionadas