Mysql avançado - otimização de índice e otimização de consulta (3)

9. Como adicionar índice a string

9.1 Índice de prefixo

MySQL suporta índices de prefixo. Por padrão, se você criar um índice sem especificar o comprimento do prefixo, o índice conterá a string inteira.

mysql> alter table teacher add index index1(email);
#或
mysql> alter table teacher add index index2(email(6));

Se você estiver usando index1 (ou seja, a estrutura de índice de toda a sequência de e-mail), a sequência de execução será a seguinte:

  1. Encontre o registro cujo valor de índice é '[email protected]' na árvore de índice index1 e obtenha o valor de ID2;
  2. Vá para a chave primária e encontre a linha cujo valor da chave primária é ID2, julgue se o valor de email está correto e adicione esta linha de registros ao conjunto de resultados;
  3. Obtenha o próximo registro na posição recém-encontrada na árvore de índice index1 e descubra que a condição email='[email protected]' não é mais atendida e o loop termina.

Durante esse processo, você só precisa recuperar os dados do índice de chave primária uma vez, para que o sistema pense que apenas uma linha foi verificada.

Se você estiver usando index2 (ou seja, estrutura de índice email(6)), a sequência de execução será a seguinte:

  1. Encontre registros que satisfaçam o valor do índice 'zhangs' na árvore de índice index2, e o primeiro encontrado é ID1;
  2. Vá para a chave primária e encontre a linha cujo valor da chave primária é ID1. Julga-se que o valor do email não é '[email protected]' e esta linha de registros é descartada;
  3. Obtenha o próximo registro na posição encontrada no índice2 e descubra que ele ainda é 'zhangs'. Retire o ID2, obtenha a linha inteira no índice de ID e julgue se desta vez o valor está correto. Adicione esta linha de registros ao o conjunto de resultados;
  4. Repita a etapa anterior até que o valor obtido em idxe2 não seja 'zhangs' e o loop termine.

Em outras palavras, usar um índice de prefixo e definir o comprimento pode economizar espaço sem adicionar muitos custos adicionais de consulta . Já falámos anteriormente sobre discriminação: quanto maior for a discriminação, melhor. Porque quanto maior a distinção, menos valores-chave duplicados.

9.2 O impacto do índice de prefixo no índice de cobertura

Conclusão:
O uso de índices de prefixo elimina a necessidade de cobrir índices para otimizar o desempenho da consulta.Este também é um fator que você precisa considerar ao escolher se deseja usar índices de prefixo.

10. Pushdown do índice

Index Condition Pushdown (ICP) é um novo recurso do MySQL 5.6. É um método de otimização que usa índices para filtrar dados na camada do mecanismo de armazenamento. O ICP pode reduzir o número de vezes que o mecanismo de armazenamento acessa a tabela base e o número de vezes que o servidor MySQL acessa o mecanismo de armazenamento.

10.1 Processo de digitalização antes e depois do uso

No processo de não usar a varredura do índice ICP:

Camada de armazenamento: apenas a linha inteira de registros correspondentes aos registros de índice que atendem às condições da chave de índice é retirada e devolvida à camada do servidor.

Camada do servidor: use a condição where subsequente para filtrar os dados retornados até que a última linha seja retornada.

O processo de uso da varredura ICP:

  • camada de armazenamento:

Primeiro, determine o intervalo de registro do índice que satisfaz a condição da chave do índice e, em seguida, use o filtro de índice no índice para filtrar. Somente os registros de índice que atendem às condições do indexfilter são retornados para a tabela e toda a linha de registros é retornada para a camada do servidor. Os registros de índice que não atendem às condições do filtro de índice são descartados e não serão retornados à tabela ou camada do servidor.

  • camada do servidor:

Para os dados retornados, use condições de filtro de tabela para filtragem final.

Diferença de custo antes e depois do uso. Antes do uso
, a camada de armazenamento retornava muitas linhas de registros que precisavam ser filtradas pelo filtro de índice.
Após usar o ICP, os registros que não atendiam às condições do filtro de índice eram removidos diretamente, eliminando a necessidade de eles serão devolvidos à mesa e passados ​​para a camada do servidor.
O efeito de aceleração do ICP depende da proporção de dados filtrados pelo ICP no mecanismo de armazenamento.

10.2 Condições de utilização do PIC

Condições para usar ICP:
① Só pode ser usado para índice secundário (índice secundário)

②O valor do tipo (tipo de junção) no plano de execução exibido por explicação é intervalo, ref, eq_ref ou ref_or_null.

③ Nem todas as condições where podem ser filtradas pelo ICP. Se o campo da condição where não estiver na coluna do índice, os registros de toda a tabela ainda deverão ser lidos no servidor para filtragem where.

④ ICP pode ser usado para mecanismos de armazenamento MyISAM e InnnoDB

⑤ O MySQL versão 5.6 não suporta a função ICP de tabelas de partição e a versão 5.7 começa a suportá-la.

⑥ Quando o SQL usa índice de cobertura, o método de otimização ICP não é suportado.

11. Índice comum versus índice único

Do ponto de vista do desempenho, você deve escolher um índice exclusivo ou um índice normal? Qual é a base para a seleção?

Suponha que tenhamos uma tabela com a coluna de chave primária como ID. Há um campo k na tabela e um índice em k. Suponha que os valores no campo k não sejam repetidos. A instrução de criação de tabela para esta tabela é:

mysql> create table test(
    id int primary key,
    k int not null,
    name varchar(16),
    index (k)
)engine=InnoDB;

Os valores (ID,k) de R1~R5 na tabela são (100,1), (200,2), (300,3), (500,5) e (600,6) respectivamente.

11.1 Processo de consulta

Suponha que a instrução para executar a consulta seja select id from test where k=5.

  • Para um índice normal, depois de encontrar o primeiro registro (5.500) que atende à condição, você precisa encontrar o próximo registro até encontrar o primeiro registro que não atende à condição k=5.
  • Para um índice exclusivo, como o índice define exclusividade, a pesquisa será interrompida após o primeiro registro que atender às condições ser encontrado.
  • Então, qual é a diferença de desempenho causada por essa diferença? A resposta é, minimamente.

11.2 Processo de atualização

Para ilustrar o impacto dos índices comuns e dos índices exclusivos no desempenho da instrução de atualização, vamos apresentar o buffer de alteração.

Quando uma página de dados precisa ser atualizada, se a página de dados estiver na memória, ela será atualizada diretamente. Se a página de dados ainda não estiver na memória, o InooDB armazenará
essas operações de atualização em cache no buffer de alteração sem afetar a consistência dos dados. não há necessidade
de ler esta página de dados do disco. Quando a próxima consulta precisar acessar esta página de dados, leia a página de dados na memória e execute as
operações relacionadas a esta página no buffer de alteração. Desta forma, a exatidão da lógica dos dados pode ser garantida.
O processo de aplicação das operações no buffer de alteração à página de dados original e obtenção dos resultados mais recentes é chamado de mesclagem. Além de acionar a mesclagem ao acessar esta página de dados
, o sistema possui threads em segundo plano que se mesclam regularmente. Durante o encerramento normal do banco de dados, a
operação de mesclagem também será executada.

Se a operação de atualização puder ser gravada primeiro no buffer de alteração para reduzir as leituras do disco, a velocidade de execução da instrução será significativamente melhorada. Além disso,
a leitura de dados na memória requer a ocupação do buffer pool, portanto, esse método também pode evitar a ocupação de memória e melhorar a utilização da memória.
O buffer de alteração não pode ser usado para atualizar o índice exclusivo. Na verdade, apenas índices comuns podem ser usados.

12. Outras estratégias de otimização de consultas

12.1 A diferença entre EXISTS e IN

Não entendo muito bem em que caso EXISTS deve ser usado e em que caso IN deve ser usado. O critério de seleção é baseado na possibilidade de uso do índice da tabela?

12.2 Eficiência de COUNT(*) e COUNT (campos específicos)

Pergunta: Existem três maneiras de contar o número de linhas em uma tabela de dados no MySQL: SELECT COUNT(*), SELECT COUNT(1) e
SELECT COUNT (campos específicos).Qual é a eficiência da consulta entre esses três métodos?

12.3 Sobre SELECIONAR(*)

Em consultas de tabela, recomenda-se especificar os campos. Não usar * como lista de campos da consulta. Recomenda-se usar a consulta SELECT <lista de campos>. Razões:
① Durante o processo de análise, o MySQL converterá "*" em todos os nomes de colunas em ordem, consultando o dicionário de dados, o que consumirá muito recursos e tempo
.
② O índice de cobertura não pode ser usado

12.4 Impacto do LIMIT 1 na otimização

Destina-se a instruções SQL que verificam a tabela inteira. Se você tiver certeza de que há apenas um conjunto de resultados, adicionar LIMIT 1 não continuará a verificação quando um resultado for encontrado, o que acelerará a consulta.

Se a tabela de dados tiver estabelecido um índice exclusivo para o campo, você poderá consultar através do índice. Se a tabela inteira não for verificada, não há necessidade de adicionar
LIMIT 1.

12.5 Use mais COMMIT

Sempre que possível, utilize o COMMIT ao máximo no programa, para que o desempenho do programa seja melhorado e a demanda seja
reduzida devido aos recursos liberados pelo COMMIT.

Recursos liberados pelo COMMIT:

  • Informações sobre o segmento de reversão usado para recuperar dados
  • Bloqueio adquirido por instrução do programa
  • Espaço no buffer de log de refazer/desfazer
  • Gerenciar gastos internos nos 3 recursos acima

Acho que você gosta

Origin blog.csdn.net/qq_51495235/article/details/133149779
Recomendado
Clasificación