Eu tenho uma tabela com um UNIQUE
índice de várias colunas _job_id__
e __keyword_id__
.
Eu também precisaria adicionar outro índice __job_id__
se tivesse uma consulta frequente que executasse uma GROUP BY
nessa coluna?
(com 100 milhões de linhas pode demorar um pouco. É por isso que estou perguntando em vez de apenas fazer)
Não, de jeito nenhum!!! O MySQL Query Optimizer fará a coisa certa se as colunas principais necessárias estiverem mais à esquerda no índice. Se você criou tal índice, o MySQL Query Optimizer pode optar por nunca usar esse índice se você sempre executar GROUP BY job_id,keyword_id. O MySQL Query Optimizer pode ou não usar o índice se você coletar registros apenas por job_id, mas terá um índice redundante desperdiçando espaço de qualquer maneira.
Se a tabela for MyISAM, fazer tal índice apenas aumentaria o tamanho do arquivo MYI.
Se a tabela for InnoDB e innodb_file_per_table for 0, criar esse índice apenas aumentaria o ibdata1.
Se a tabela for InnoDB e innodb_file_per_table for 1, criar esse índice apenas aumentaria o tamanho do arquivo .ibd da tabela.
Resumindo, não precisa fazer aquele índice adicional!!!
Os índices só podem acelerar as
group by
operações reduzindo a classificação - isso será mais eficiente se o índice usado for o índice clusterizado ou pelo menos tiver a mesma coluna inicial que o índice clusterizado. Em tudo isso, estou assumindo que o MySQL não tem equivalente a umahash group by
operação que normalmente ignoraria qualquer benefício dos índices - talvez alguém possa confirmar isso.Há um benefício marginal em ter um índice separado ao
job_id
assumir que é a única coluna nagroup by
cláusula e nenhum é o índice clusterizado: o índice será menor e, portanto, a varredura gerará menos E/S--EDITAR--
Como um índice contém todos os campos de chave primária definidos para a chave de índice clusterizado que não estão no índice secundário , um índice
job_id
somente será menor que um índicejob_id, keyword_id
sekeyword_id
não fizer parte do índice clusterizado.