mac - mysql wikipedia
¿Cuál es la diferencia entre "Usar índice" y "Usar dónde; Usando índice ”en el EXPLICAR (1)
Cuando vea Using Index
en la parte extra de una explicación, significa que el índice (que cubre) es adecuado para la consulta.
En su ejemplo: SELECT id FROM test WHERE id = 5;
el servidor no necesita acceder a la tabla real, ya que puede satisfacer la consulta (solo tiene acceso a la id
) utilizando solo el índice (como dice la explicación). En caso de que no sepa que el PK se implementa a través de un índice único.
Cuando ves Using Index; Using where
Using Index; Using where
significa que primero se usa el índice para recuperar los registros (no se necesita un acceso real a la tabla) y luego, encima de este conjunto de resultados, se realiza el filtrado de la cláusula where.
En este ejemplo: SELECT id FROM test WHERE id > 5;
todavía obtiene un id para el índice y luego aplica la condición mayor que para filtrar los registros que no coinciden con la condición
En el campo extra de la explicación en mysql puede obtener:
Using index
-
Using where; Using index
¿Cuál es la diferencia entre los dos?
Para explicar mejor mi pregunta voy a usar la siguiente tabla:
CREATE TABLE `test` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`another_field` int(11) NOT NULL DEFAULT ''0'',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
INSERT INTO test() VALUES(),(),(),(),();
Lo que termina con el contenido como:
SELECT * FROM `test`;
id another_field
1 0
2 0
3 0
4 0
5 0
En mi investigación encontré
¿Por qué esta consulta utiliza dónde en lugar de índice?
La salida de
EXPLAIN
veces puede ser engañosa.Por ejemplo,
filesort
no tiene nada que ver con los archivos,using where
no significa que está usando una cláusulaWHERE
, y elusing index
puede aparecer en las tablas sin un solo índice definido.
Using where
solo significa que hay alguna cláusula de restricción en la tabla (WHERE
oON
), y no se devolverá todo el registro. Tenga en cuenta queLIMIT
no cuenta como una cláusula de restricción (aunque puede ser).
Using index
significa que toda la información se devuelve desde el índice, sin buscar los registros en la tabla. Esto solo es posible si todos los campos requeridos por la consulta están cubiertos por el índice.Ya que estás seleccionando
*
, esto es imposible. Los campos que no seancategory_id
,board_id
,display
yorder
no están cubiertos por el índice y deben consultarse.
y tambien encontre
https://dev.mysql.com/doc/refman/5.1/en/explain-output.html#explain-extra-information
Usando el índice
La información de la columna se recupera de la tabla utilizando solo la información en el árbol de índice sin tener que hacer una búsqueda adicional para leer la fila real. Esta estrategia se puede utilizar cuando la consulta solo utiliza columnas que forman parte de un único índice.
Si la columna Extra también dice Usar dónde, significa que el índice se está utilizando para realizar búsquedas de valores clave. Sin usar Where, el optimizador puede estar leyendo el índice para evitar leer filas de datos pero no usarlo para búsquedas. Por ejemplo, si el índice es un índice de cobertura para la consulta, el optimizador puede escanearlo sin usarlo para búsquedas.
Para las tablas InnoDB que tienen un índice agrupado definido por el usuario, ese índice puede usarse incluso cuando el índice de uso está ausente en la columna Extra. Este es el caso si el tipo es índice y la clave es PRIMARIA.
(Mira el segundo párrafo)
Mi problema con esto:
Primero: no entendí el segundo párrafo de la forma en que está escrito.
Segundo:
La siguiente consulta devuelve
EXPLAIN SELECT id FROM test WHERE id = 5;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE test const PRIMARY PRIMARY 8 const 1 Using index
(Desplácese hacia la derecha)
Y esta otra consulta devuelve:
EXPLAIN SELECT id FROM test WHERE id > 5;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE test range PRIMARY PRIMARY 8 NULL 1 Using where; Using index
(Desplácese hacia la derecha)
Aparte del hecho de que una consulta usa una búsqueda de rango y otra usa la búsqueda constante, ambas consultas están usando some restricting clause on the table (WHERE or ON), and not all record will be returned
.
¿Qué hace el Using where;
significa en la segunda consulta significa? ¿Y qué significa el hecho de que no esté en la primera consulta?
EXTRA
¿Cuál es la diferencia con el Using index condition; Using where
Using index condition; Using where
? (No estoy agregando un ejemplo de esto porque no he podido reproducirlo en una pequeña pieza del código del sistema operativo)