Preciso adicionar um novo índice de coluna única a uma tabela se já existir um índice de várias colunas nesse campo?

10

Eu tenho uma tabela com um UNIQUEíndice de várias colunas em _job_id__e __keyword_id__.

Também precisaria adicionar outro índice __job_id__se eu tiver uma consulta frequente que execute uma GROUP BYnessa coluna?

(em 100 milhões de linhas, pode demorar um pouco. É por isso que estou perguntando, em vez de apenas fazer)

JIStone
fonte
Se sua pergunta real é sobre uma consulta lenta, forneça SHOW CREATE TABLE SHOW TABLE STATUS MOSTRAR VARIÁVEIS COMO '% buffer%' EXPLAIN SELECT ... Quanta RAM está disponível? Existem muitas razões possíveis; a maioria pode ser vista olhando sobre esses itens.
Rick James

Respostas:

5

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 esse í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 você tem um índice redundante desperdiçando espaço de qualquer maneira.

Se a tabela for MyISAM, a criação de um índice desse tipo aumentaria o tamanho do arquivo MYI.

Se a tabela for InnoDB e innodb_file_per_table for 0, criar um índice como esse iria inchar o ibdata1.

Se a tabela for InnoDB e innodb_file_per_table for 1, criar um índice desse tipo apenas inchará o arquivo .ibd da tabela.

Em resumo, você não precisa criar esse índice adicional !!!

RolandoMySQLDBA
fonte
Você tem certeza? Esse cara sugere o contrário: stackoverflow.com/questions/179085/… ou isso é diferente do MySQL para MSSQL?
Tadej
4

Os índices podem acelerar as group byoperações apenas reduzindo a classificação - isso será mais eficiente se o índice usado for o índice em cluster ou pelo menos tiver a mesma coluna principal que o índice em cluster. Em tudo isso, estou assumindo que o MySQL não tem equivalente de uma hash group byoperaçã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_idassumir que essa é a única coluna da group bycláusula e nem 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 em cluster que não estão no índice secundário , um índice job_idativado será menor que um índice job_id, keyword_idse keyword_idnão fizer parte do índice clusterizado.

Jack diz que tenta topanswers.xyz
fonte