2009-12-06 24 views

Respuesta

13

Absolutamente el último. Puede tomar el valor directo del índice de PK, mientras que el primero casi con certeza requiere un escaneo de tabla (a menos que cada columna sea parte de un índice, e incluso entonces, tiene que tomar valores de todos los índices). A continuación, dependiendo de cómo se va a conectar a la base de datos, hay una gran cantidad de tránsito de datos sólo para obtener un recuento.

explain puede ayudar aquí. En este caso, le dirá que la selección está optimizada.

1

Este último es más probable tener un mejor desempeño ya que su única están transmitiendo un único entero mientras que, en el primer escenario, se le envía una porción entera más datos.

+1

MySQL en realidad no transmite datos antes de llamar a 'mysql_fetch_array' – Andomar

+0

por lo que en ese caso ¿por qué no es el primero ¿uno mejor? – Wolfgang

+0

MySQL todavía tendrá los resultados de la consulta buffer de alguna manera hasta que los datos es totalmente descabellada. –

4

Además de la respuesta de Zxpro, también existe el esfuerzo interno de MySQL:

select * from tbl where pk = 1 

fuerzas MySQL para recuperar las filas coincidentes físicamente; mientras que

select count(*) as total from tbl where pk = 1 

permite MySQL para contar las entradas de la clave principal, sin tener que recuperar todas las filas de la tabla

1

Si "PK" es la clave principal, sólo puede haber un registro, así que la respuesta va a ser ya sea 0 o 1, por lo que realmente no necesita contarlos de todos modos.

Pero sí, el último.

InnoDB no SOLO necesita comprobar el índice, también debe verificar que la (s) fila (s) sean visibles para la transacción actual, debido a MVCC. Pero esto es un detalle. Utilizará un índice de cobertura de todos modos (que es irrelevante si pk es la clave principal, ya que siempre está en clúster)

Cuestiones relacionadas