2012-04-15 9 views
7

Tengo una pregunta muy simple:Mi sencilla consulta MySQL no utilizar el índice

SELECT comments.* 
    FROM comments 
    WHERE comments.imageid=46 

y este es mi tabla:

CREATE TABLE IF NOT EXISTS `comments` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `imageid` int(10) unsigned NOT NULL DEFAULT '0', 
    `uid` bigint(20) unsigned NOT NULL DEFAULT '0', 
    `content` text CHARACTER SET utf8, 
    `adate` datetime DEFAULT NULL, 
    `ip` int(10) unsigned DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `ids` (`imageid`) USING BTREE, 
    KEY `dt` (`adate`) USING BTREE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ; 

Pero MySQL no puede utilizar índice en esta consulta sencilla . aquí está el resultado de la explicación:

id select_type  table type possible_keys key  key_len  ref  rows filtered Extra 
1 SIMPLE comments ALL  ids  NULL NULL NULL 4 75.00 Using where 

mientras cambio la consulta a esto, Mysql puede usar el índice. ¿Por qué? :

SELECT comments.id 
    FROM comments 
    WHERE comments.imageid=46 

aquí es la explique:

id select_type  table type possible_keys key  key_len  ref  rows filtered Extra 
1 SIMPLE comments ref  ids  ids  4 const 4 100.00 Using index 
+0

No es * "Pero MySql ** no puede ** usar el índice" *. Es: "Pero MySql ** no ** usará el índice". Las 'posibles_keys = ids' y' key = NULL' sugieren que el uso del índice fue examinado por el optimizador y rechazado. Se pensó que la exploración completa de la tabla era más rápida, y probablemente sea en su caso. –

Respuesta

6

supongo que tiene pocas filas de la tabla 'comentarios', esta es la razón por MySQL está haciendo una completa escaneo de tabla en lugar de usar el índice en su primera consulta. Se estima que el costo de una exploración de tabla completa puede ser menor que el primero coincida con el índice y luego buscar las filas.

En su segunda consulta está utilizando el índice porque es posible obtener todas las columnas de la consulta (la columna 'id') directamente del índice sin necesidad de buscar las filas de la tabla después de hacer coincidir el índice. Este es el significado de "Usar índice" de información adicional.

Prueba si con un número significativo de filas en "comentarios" MySQL todavía utiliza un escaneo completo, creo que sería un comportamiento extraño. De hecho, he probado exactamente lo mismo en una versión 5.1 de MySQL y siempre está usando el 'índice' incluso con pocas filas.

+0

Gracias, hombre, ¡tienes razón! ;) – MscEliot

1

La segunda consulta es una consulta cubierta por índice. Toda la información solicitada se puede leer desde el índice (ya que la clave primaria es parte de cualquier índice secundario en InnoDB).

En la primera consulta, MySQL tiene que leer los PK del índice y luego leer las filas. Como la tabla tiene una cantidad tan pequeña de filas, el optimizador decide que sería más rápido si lee filas directamente y descarta las que no coinciden

Cuestiones relacionadas