2010-09-04 9 views
5
EN

Si escribo esta consulta,índice de MySQL no ayuda en

EXPLAIN SELECT * FROM `smth` WHERE d_id = 9 

comprueba una fila al instante. Pero cuando se utiliza IN, por ejemplo

EXPLAIN SELECT * FROM `smth` WHERE d_id IN (9, 3) 

comprueba todas las filas. ¿Qué debería hacer en lugar de IN si el índice no ayuda allí?

+0

sí, también tengo curiosidad por saber la respuesta –

+0

¿Por qué crees que revisa todas las filas? ¿Puedes publicar el resultado de EXPLAIN SELECT? –

+0

Puede ser de interés: http://stackoverflow.com/questions/586381/mysql-not-using-indexes-with-where-in-clause – Fionnuala

Respuesta

7

MySQL 5.1 tiene un tipo de combinación range que optimiza los predicados IN. Ver http://dev.mysql.com/doc/refman/5.1/en/explain-output.html

Sin embargo, el optimizador de MySQL puede haber determinado que su columna d_id contiene los valores 9 y 3 en una gran mayoría de filas que decidió que sería más barato leer la tabla completa que leer el índice y luego mesa.

Por analogía, si lee un libro y desea encontrar cada página que tenga la palabra "the", vaya al índice en la parte posterior del libro, busque "the" y voltee a cada página ¿en turno? ¿O simplemente leería el libro de principio a fin porque se garantiza que casi todas las páginas tienen esa palabra en él?

+2

En realidad, fue una excelente explicación. Acabo de insertar muchas filas e intenté utilizar IN nuevamente y ahora solo comprobé algunas filas, no todas. Gracias. –

1

Probablemente se deba a que su tabla no contiene muchas filas. Si su tabla contiene más filas, probablemente use el índice. Aquí hay un ejemplo de una tabla con un millón de filas:

 
EXPLAIN SELECT * FROM table1 WHERE x = 9; 
1, 'SIMPLE', 'table1', 'const', 'PRIMARY', 'PRIMARY', '4', 'const', 1, '' 

EXPLAIN SELECT * FROM table1 WHERE x IN (9, 3); 
1, 'SIMPLE', 'table1', 'range', 'PRIMARY', 'PRIMARY', '4', '', 2, 'Using where' 

En ambos casos, se utiliza el índice de clave principal.

Cuestiones relacionadas