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

MySQL deja de usar el índice cuando se agregan restricciones adicionales

Esto es un poco difícil de explicar.

La consulta que usa el índice lo está usando porque el índice es un índice de "cobertura". Es decir, todas las columnas del índice están en la consulta. La única parte del índice que realmente se usa de manera efectiva es la condición en latitude .

Normalmente, un índice de cobertura tendría solo las columnas mencionadas en la consulta. Sin embargo, la clave principal se usa para hacer referencia a los registros, así que supongo que users.Id es la clave principal en la tabla. Y el índice se escanea en busca de valores válidos de latitude .

La consulta que no usa el índice no lo usa por dos razones. Primero, las condiciones en las columnas son desigualdades. Una búsqueda de índice solo puede usar condiciones de igualdad y una desigualdad. Eso significa que el índice solo podría usarse para latitude en su método más eficaz. En segundo lugar, las columnas adicionales en la consulta requieren ir a la página de datos de todos modos.

En otras palabras, el optimizador está, en efecto, diciendo:"¿Por qué molestarse en ir al índice para escanear el índice y luego escanear las páginas de datos? En cambio, puedo simplemente escanear las páginas de datos y obtener todo de una vez".

Tu próxima pregunta es sin duda:"¿Pero cómo hago para que mi consulta sea más rápida?" Mi sugerencia sería investigar índices espaciales .