sql >> Base de Datos >  >> RDS >> Mysql

MySQL no usa el índice cuando verifica =1, pero lo usa con =0

¿Por qué MySQL no usa un índice?
MySQL no usará un índice si un gran porcentaje de las filas tienen ese valor.

¿Por qué añadir use index? a la consulta no funciona aquí
Agregar un use index la cláusula no tendrá efecto, porque use index solo sugerirá cuál índice para usar, no sugerirá si usar un índice o no.

Advertencia al usar tablas de prueba con pocas filas
Esto es especialmente molesto cuando se usan tablas de prueba con pocas filas, ya que MySQL se negará a usar un índice y es difícil ver qué está mal con su consulta.
Así que asegúrese de agregar suficientes filas a una tabla de prueba para que sea una prueba realista.

¿Es inútil usar un índice en columnas de baja cardinalidad?
La indexación en columnas booleanas no es tan útil como pensabas antes de hacer esta pregunta.
Sin embargo, tampoco es inútil tampoco.
Con InnoDB MySQL intentará recuperar datos usando los índices si es posible, si su campo booleano tiene un índice, la consulta:

SELECT id, bool_field FROM table_with_many_columns_and_rows WHERE bool_field = 1

Puede leer todos los datos en el índice de cobertura para bool_field porque los índices secundarios en InnoDB siempre incluyen el índice principal (id) también.
Esto es más rápido porque MySQL no tiene que leer toda la tabla en la memoria.

En MyISAM esto no funciona y MySQL examinará toda la tabla.

Pero puedo usar force index
Puede, pero en índices de baja cardinalidad hará que su consulta sea más lenta, no más rápida. Solo anule los índices en consultas complejas y solo si conoce las reglas que utiliza MySQL para seleccionar índices.

Enlaces:
Ver:http://dev.mysql .com/doc/refman/5.1/en/mysql-indexes.html
y: http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/

Si desea un libro sobre este tema:lea
MySQL de alto rendimiento:http://oreilly.com /catalog/9780596003067