Eu tenho a seguinte tabela (há mais colunas na real).
CREATE TABLE `test`.`j_data` (
`j_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`j_name` VARCHAR(80) NULL DEFAULT NULL
PRIMARY KEY (`j_id`));
Executamos consultas regularmente em que a coluna principal usada é o PK, por exemplo
SELECT * FROM j_data WHERE j_id = 123;
Mas agora estamos procurando executar muitas consultas como:
SELECT j_id FROM j_data WHERE j_name = xxx;
Isso se beneficiaria de um índice de cobertura em j_name
e j_id
.
ADD INDEX `j_name_id` (`j_name` ASC, `j_id` ASC);
Ou um índice em j_name
apenas seria suficiente? É uma tabela bastante grande, então não quero perder tempo adicionando o índice se for improvável que ajude.
Resposta curta: Sim.
Resposta longa:
Você está usando o InnoDB, correto? (Corra
SHOW CREATE TABLE j_data
para descobrir o que é o Motor.)No InnoDB, cada "índice secundário" (contraste "chave primária") contém silenciosamente uma cópia da chave primária.
Então...
INDEX(j_name)
passa a ser idêntico aoINDEX(j_name, j_id)
.Dica: Em algum momento você perceberá que prefixar todas as colunas com o nome da tabela ("j_") é uma desordem desnecessária.