Banco de dados MySQL - Índice (5) - Uso do índice (Parte 1), verificação da eficiência do índice, regra do prefixo mais à esquerda, consulta de intervalo, falha no índice, prompts SQL

Índice

Uso do índice

Verifique a eficiência do índice

regra do prefixo mais à esquerda

consulta de intervalo

Falha no índice

Operações de coluna de índice

String sem aspas

consulta difusa

ou condições de conexão

Impacto na distribuição de dados

Solicitação SQL 

usar índice

ignorar índice

índice de força


Uso do índice (Parte 1)

Verifique a eficiência do índice

Antes de explicar os princípios do uso de índices, vamos primeiro verificar o índice para ver se ele pode ser usado para melhorar o desempenho da consulta de dados.

Durante a demonstração, ainda utilizamos a tabela anterior tb_sku e preparamos 10 milhões de registros nesta tabela.

Nesta tabela, id é a chave primária e possui um índice de chave primária, mas outros campos não são indexados. Vamos primeiro consultar um dos registros para ver os campos dentro dele e executar o seguinte SQL:

select * from tb_sku where id = 1\G;
-- \G使行列互换,展示得更加清晰

resultado da pesquisa: 

Pode-se observar que mesmo que existam 10 milhões de dados, o desempenho da consulta de dados baseada no id ainda é muito rápido, pois a chave primária id é indexada .

A seguir, consultaremos com base no campo sn e executaremos o seguinte SQL (o campo sn não está indexado):

SELECT * FROM tb_sku WHERE sn = '100000003145001';

 resultado da pesquisa:

Podemos ver que a consulta baseada no campo sn retornou um dado e o resultado demorou 20,78 segundos , isso ocorre porque sn não possui índice , resultando em baixa eficiência de consulta .
Então podemos criar um índice para o campo sn.Depois de estabelecer o índice, consultamos novamente com base em sn e, em seguida, observamos o consumo de tempo de consulta.

Criar índice:

create index idx_sku_sn on tb_sku(sn);

O processo de criação desse índice pode demorar muito, pois há muitos dados na tabela e leva muito tempo para construir uma árvore B+Tree.

Após criar este índice, executamos a mesma instrução SQL novamente para ver seu consumo de tempo.

SELECT * FROM tb_sku WHERE sn = '100000003145001'\G;

Obviamente, veremos que depois que o campo sn for indexado, o desempenho da consulta melhorará bastante. Antes e depois da indexação, o tempo de consulta não é da mesma ordem de grandeza.

regra do prefixo mais à esquerda

Se múltiplas colunas forem indexadas (índice conjunto), a regra de prefixo mais à esquerda deverá ser seguida.

A regra do prefixo mais à esquerda significa que a consulta começa na coluna mais à esquerda do índice e não pula colunas no índice. Se uma coluna for ignorada, o índice será parcialmente inválido (os índices dos campos subsequentes serão inválidos).

Por exemplo, atualmente existe um índice conjunto na tabela tb_user. Esse índice conjunto envolve três campos, na ordem: profissão, idade, status.
A regra do prefixo mais à esquerda significa que, ao consultar, a coluna mais à esquerda, ou seja, profissão, deve existir, caso contrário, todos os índices falharão. E uma coluna não pode ser ignorada no meio, caso contrário o índice do campo atrás da coluna será inválido.

por exemplo:

Ao consultar, se existe profissão, não existe idade e existe status, então apenas o índice de profissão terá efeito neste momento;

Se não existir profissão, existir idade e existir status, então o índice não será usado neste momento;

Nota: A regra do prefixo mais à esquerda não tem nada a ver com a ordem em que as condições de consulta são escritas, mas apenas com a ordem em que os índices conjuntos são estabelecidos.

Agora mesmo,

explain select * from tb_user where 
profession = '软件工程' 
and age = 31 
and status = '0';

-- 这两条SQL是一致的

explain select * from tb_user where 
age = 31 
and status = '0' 
and profession = '软件工程';

consulta de intervalo

No índice conjunto, ocorre uma consulta de intervalo (>,<) e o índice da coluna no lado direito da consulta de intervalo torna-se inválido.

Por exemplo:

explain select * from tb_user where 
profession = '软件工程' 
and age > 30 
and status = '0';  -- status在>之后,所以该列索引失效

Portanto, apenas os campos profissão e idade são indexados.

Quando o negócio permitir, use consultas de intervalo como >= ou <= tanto quanto possível e evite usar > ou <.

Falha no índice

  • Operações de coluna de índice

Não execute operações em colunas de índice, o índice se tornará inválido.

Por exemplo, se você executar uma operação de função no campo telefone, seu índice será inválido:

explain select * from tb_user where substring(phone,10,2) = '15';

  • String sem aspas

explain select * from tb_user where 
profession = '软件工程' 
and age = 31 
and status = '0';

--  没有加引号的话,status字段的索引就会失效

explain select * from tb_user where 
profession = '软件工程' 
and age = 31 
and status = 0;

Não há impacto nos resultados da consulta, mas há conversão implícita de tipo no banco de dados e o índice se tornará inválido.

  • consulta difusa

Se houver apenas uma correspondência difusa de cauda, ​​o índice não será invalidado. Se for uma correspondência difusa de cabeçalho, o índice será inválido.

Por exemplo:

explain select * from tb_user where profession like '软件%';
explain select * from tb_user where profession like '%工程';  -- 索引失效
explain select * from tb_user where profession like '%工%';   -- 索引失效

Na consulta difusa semelhante, adicione% após a palavra-chave para tornar o índice eficaz. E se % for adicionado na frente da palavra-chave, o índice será inválido.

  • ou condições de conexão

Condições separadas por ou, se a coluna da condição anterior ou tiver índice, mas não houver índice na coluna seguinte, então os índices envolvidos não serão utilizados.

Por exemplo, as duas instruções SQL a seguir:

explain select * from tb_user where id = 10 or age = 23;
explain select * from tb_user where phone = '17799990017' or age = 23;
-- age没有索引,其作为联合索引也不满足最左前缀法则

Como a idade não possui índice, mesmo que id e telefone tenham índices, os índices serão inválidos. Portanto, é necessário criar um índice por idade.

O índice só terá efeito quando as condições da conexão OR incluírem índices nos campos esquerdo e direito.

  • Impacto na distribuição de dados

Se o MySQL avaliar que o uso de um índice é mais lento que a tabela completa, o índice não será usado.

Quando o MySQL consulta, ele avaliará a eficiência do uso do índice e a eficiência de uma varredura completa da tabela. Se uma varredura completa da tabela for mais rápida, ele abandonará o índice e usará uma varredura completa da tabela. Como o índice é usado para indexar uma pequena quantidade de dados, se uma grande quantidade de dados for retornada por meio de uma consulta de índice, não será tão rápido quanto uma varredura completa da tabela e o índice se tornará inválido.

Solicitação SQL 

Os prompts SQL são um meio importante de otimizar o banco de dados. Simplificando, eles adicionam alguns prompts artificiais às instruções SQL para atingir o objetivo de otimizar as operações.

Quando o MySQL consulta externamente, se houver vários índices que podem ser usados, o MySQL selecionará automaticamente um índice para usar. Podemos especificar qual índice usar durante a consulta? A resposta é sim, e isso pode ser feito com a ajuda do prompt SQL do MySQL.

A seguir, apresente o prompt SQL.

  • usar índice

Recomende qual índice o MySQL usa para completar esta consulta (apenas uma sugestão, o mysql irá avaliá-lo novamente internamente).

explicar select * from tb_user use index(idx_user_pro)
where profession = 'Engenharia de Software';

  • ignorar índice

Ignore o índice especificado.

explicar selecionar * de tb_user ignorar índice (idx_user_pro)

onde profissão = 'Engenharia de Software';

  • índice de força

Forçar o uso de índices.

explique a seleção * do índice de força tb_user (idx_user_pro)

onde profissão = 'Engenharia de Software';


FIM 


Aprenda com: Dark Horse Programmer - Curso de banco de dados MySQL

Acho que você gosta

Origin blog.csdn.net/li13437542099/article/details/133217910
Recomendado
Clasificación