2012-08-31 26 views
29

Imagine una tabla con varias columnas, por ejemplo, id, a, b, c, d, e. Por lo general, selecciono por id, sin embargo, hay varias consultas en la aplicación cliente que usa varias condiciones sobre subconjuntos de las columnas.¿Puede MySQL usar múltiples índices para una sola consulta?

Cuando MySQL ejecuta una consulta en una sola tabla con múltiples condiciones WHERE en varias columnas, ¿realmente puede hacer uso de los índices creados en columnas diferentes? ¿O la única forma de hacerlo rápido es crear índices de varias columnas para todas las consultas posibles?

+0

¿Tiene un ejemplo de consulta para nosotros? – ZombieCode

+6

@Ekaterina, привет :) La pregunta cubre una pregunta general que atrae la práctica y la experiencia, estoy seguro de que aquí no se necesita una consulta específica. Sin embargo, puedo pensar en un ejemplo si eso tiene sentido – kolypto

Respuesta

47

Sí, MySQL puede usar múltiples índices para una sola consulta. El optimizador determinará qué índices beneficiarán a la consulta. Puede usar EXPLAIN para obtener información sobre cómo MySQL ejecuta una instrucción. Se pueden añadir o ignorar índices utilizando consejos de este modo:

SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX FOR ORDER BY (i2) ORDER BY a; 

que sugeriría leer sobre how MySQL uses indexes.

sólo unos extractos:

Si hay una posibilidad de elegir entre varios índices, MySQL normalmente utiliza el índice que encuentra el menor número de filas.

Si existe un índice de varias columnas en col1 y col2, las filas apropiadas se pueden recuperar directamente. Si existen índices separados de una sola columna en col1 y col2, el optimizador intentará utilizar la optimización de Index Merge (consulte la Sección 8.3.1.4, "Optimización de Merge de índices") o para buscar el índice más restrictivo al decidir qué index encuentra menos filas y usa ese índice para buscar las filas.

+2

Wow eso es algo nuevo o lo perdí en los documentos. Gracias, eso es interesante :) De todos modos, un índice de varias columnas para casos específicos debería ser mucho más eficiente. – kolypto

15

Clásicamente, MySQL puede usar un índice por referencia de tabla en una consulta determinada. Sin embargo, en versiones más recientes de MySQL, puede tener lugar una operación llamada index merge y permitir a MySQL usar más de un índice por tabla.

http://openquery.com/blog/mysql-50-index-merge-using-multiple-indexes

+3

Creo que debería editar eso para: * "puede usar un índice por tabla ** referencia **" * –

Cuestiones relacionadas