¿Necesito agregar un nuevo índice de una sola columna a una tabla si ya existe un índice de varias columnas en ese campo?


10

Tengo una tabla con un UNIQUEíndice de varias columnas en _job_id__y __keyword_id__.

¿También necesitaría agregar otro índice __job_id__si tengo una consulta frecuente que realiza una GROUP BYen esa columna?

(en 100 millones de filas podría tomar un tiempo. Es por eso que pregunto en lugar de hacerlo)


Si su pregunta real es sobre una consulta lenta, proporcione MOSTRAR CREAR TABLA MOSTRAR ESTADO DE LA MESA MOSTRAR VARIABLES COMO '% buffer%' EXPLICAR SELECCIONAR ... ¿Cuánta RAM hay disponible? Hay muchas razones posibles; la mayoría se puede ver mirando esos artículos.
Rick James

Respuestas:


5

No, en absoluto !!! MySQL Query Optimizer hará lo correcto si las columnas principales necesarias se encuentran más a la izquierda en el índice. Si creó dicho índice, MySQL Query Optimizer puede optar por nunca usar ese índice si siempre realiza GROUP BY job_id, keyword_id. MySQL Query Optimizer puede o no usar el índice si reúne registros solo por job_id, pero de todos modos tiene un espacio de pérdida de índice redundante.

Si la tabla es MyISAM, hacer un índice de este tipo simplemente hincharía el archivo MYI.

Si la tabla es InnoDB y innodb_file_per_table es 0, hacer un índice de este tipo simplemente aumentaría ibdata1.

Si la tabla es InnoDB y innodb_file_per_table es 1, hacer un índice de este tipo simplemente hincharía el archivo .ibd de la tabla.

En resumen, no necesita hacer ese índice adicional !!!


¿Estás seguro? Este tipo sugiere lo contrario: stackoverflow.com/questions/179085/… o ¿es diferente de MySQL a MSSQL?
Tadej

4

Los índices solo pueden acelerar las group byoperaciones al reducir la clasificación ; esto será más eficiente si el índice utilizado es el índice agrupado o al menos tiene la misma columna inicial que el índice agrupado. En todo esto, supongo que MySQL no tiene el equivalente de una hash group byoperación que generalmente omitiría cualquier beneficio de los índices, tal vez alguien más pueda confirmar esto.

Hay un beneficio marginal de tener un índice separado job_idsuponiendo que es la única columna en la group bycláusula y tampoco lo es el índice agrupado: el índice será más pequeño y, por lo tanto, el escaneo generará menos E / S

--EDITAR--

Como un índice contiene todos los campos de clave primaria definidos para la clave de índice agrupado que no están en el índice secundario , un índice job_idactivado solo será menor que un índice activado job_id, keyword_idsi keyword_idno es parte del índice agrupado.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.