Plano de execução 2 do Mysql

Artigo anterior - plano de execução do Mysql

Índice de cobertura

Índice de cobertura (Índice de cobertura), considerado a cobertura do índice.
Entendendo o método um: isto é, a coluna de dados de seleção pode ser obtida apenas do índice, sem ler a linha de dados, o MySQL pode usar o índice para retornar os campos na lista de seleção, sem ter que ler o arquivo de dados novamente de acordo com o índice, em outras palavras, consulta a coluna a ser coberta pelo índice criado.
Noções básicas sobre o método 2: Índice é uma maneira de localizar linhas com eficiência, mas o banco de dados geral também pode usar o índice para localizar os dados de uma coluna, portanto, não precisa ler a linha inteira. Afinal, os nós folha do índice armazenam os dados que indexam; quando os dados desejados podem ser obtidos pela leitura do índice, não há necessidade de ler as linhas. Um índice que contém (ou cobre) dados que atendem aos resultados da consulta é chamado de índice de cobertura

Nota: Se você quiser usar um índice de cobertura, certifique-se de tirar apenas as colunas obrigatórias da lista de seleção, não selecione *, porque se todos os campos forem indexados juntos, o arquivo de índice será muito grande e o desempenho da consulta diminuirá . Portanto, você não deve criar índices em todas as colunas para consulta, o que afetará seriamente o desempenho de modificação e manutenção.

Usando where 与 usando buffer de junção

Usar where indica que onde a filtragem é usada,
usando o buffer de junção e o cache de conexão é usado:

show VARIABLES like '%join_buffer_size%'

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
EXPLAIN select * from t1 JOIN t2 on t1.other_column = t2.other_column

impossível onde

O valor da cláusula where é sempre falso e não pode ser usado para obter nenhuma tupla (as condições de consulta impossíveis)Insira a descrição da imagem aqui

EXPLAIN select * from t1 onde 1 = 2
EXPLAIN select * from t1 onde t1.other_column = 'enjoy' e t1.other_column = 'edu'

Otimização SQL

Otimize o combate real

Estratégia 1. Tente combinar o valor total

Insira a descrição da imagem aqui

CREATE TABLE `staffs`( id int primary key auto_increment,
 name varchar(24) not null default "" comment'姓名',
 age int not null default 0 comment '年龄', 
 pos varchar(20) not null default "" comment'职位', 
 add_time timestamp not null default current_timestamp comment '入职时间' )charset utf8 comment '员工记录表';
insert into staffs(name,age,pos,add_time) values('z3',22,'manage',now());
 insert into staffs(name,age,pos,add_time) values('july',23,'dev',now()); 
 insert into staffs(name,age,pos,add_time) values('2000',23,'dev',now()); 
 alter table staffs add index idx_staffs_nameAgePos(name,age,pos); EXPLAIN SELECT * FROM staffs WHERE NAME = 'July';

EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' AND age = 25; 
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' AND age = 25 AND pos = 'dev'

Quando a coluna de índice é criada, você pode usar o índice na condição em que estiver, tanto quanto possível

Estratégia 2. A melhor regra de prefixo esquerdo

Se várias colunas forem indexadas, siga a regra de prefixo mais à esquerda. Isso significa que a consulta começa na coluna frontal mais à esquerda do índice e não ignora as colunas do índice.
Insira a descrição da imagem aqui

EXPLAIN SELECT * FROM staffs WHERE age = 25 AND pos = 'dev' 
EXPLAIN SELECT * FROM staffs WHERE pos = 'dev' 
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July'

Estratégia 3. Não faça nada na coluna do índice

Não faça nenhuma operação (cálculo, função, conversão de tipo (automática ou manual)) na coluna do índice, isso fará com que o índice falhe e gire para a varredura completa da tabela
Insira a descrição da imagem aqui

EXPLAIN SELECT * FROM staffs WHERE NAME = 'July'; 
EXPLAIN SELECT * FROM staffs WHERE left(NAME,4) = 'July';

Estratégia 4. Condições de escopo colocadas em último lugar

Insira a descrição da imagem aqui

EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' ; 
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' and age =22;

 EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' and age =22 and pos='manager' 中间有范围查询会导致后面的索引列全部失效 
 EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' and age >22 and pos='manager'

Estratégia 5. Use o índice de cobertura tanto quanto possível

Insira a descrição da imagem aqui
Tente usar um índice de cobertura (apenas o acesso à consulta de índice (a coluna de índice e a coluna de consulta são consistentes)), reduza o select *

EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' and age =22 and pos='manager' 
EXPLAIN SELECT name,age,pos FROM staffs WHERE NAME = 'July' and age =22 and pos='manager' 
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' and age >22 and pos='manager' 
EXPLAIN SELECT name,age,pos FROM staffs WHERE NAME = 'July' and age >22 and pos='manager'

Estratégia 6. Não significa que você precisa usá-la

O MySQL não pode usar o índice quando ele não é igual a (! = Ou <>), o que causará uma varredura completa da tabela
Insira a descrição da imagem aqui

EXPLAIN SELECT * FROM staffs WHERE NAME = 'July'; EXPLAIN SELECT * FROM staffs WHERE NAME != 'July'; 
EXPLAIN SELECT * FROM staffs WHERE NAME <> 'July'; 
#如果定要需要使用不等于,请用覆盖索引 
EXPLAIN SELECT name,age,pos FROM staffs WHERE NAME != 'July'; 
EXPLAIN SELECT name,age,pos FROM staffs WHERE NAME <> 'July';

Estratégia 7. Nulo / Não tem impacto

Observe o possível impacto de nulo / não nulo no índice

Personalizar como NOT NULL

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
EXPLAIN select * from staffs onde name é nulo
EXPLAIN select * from staffs where name not null
Quando o campo não for null, using is null ou not null fará com que o índice se torne inválido

Solução: cobrindo o índice,
EXPLIQUE selecione o nome, idade, posição de equipes onde o nome não é nulo

Personalizar como NULL ou indefinido

Insira a descrição da imagem aqui
EXPLAIN select * from staffs2 onde o nome é nulo
Insira a descrição da imagem aqui
EXPLAIN select * from staffs2 onde o nome não é nulo
Insira a descrição da imagem aqui
Se não for nulo fará com que o índice se torne inválido

Solução: cobrindo o índice,
EXPLIQUE selecione o nome, idade, posição de equipes onde o nome não é nulo

Estratégia 8. Esteja atento a consultas semelhantes

como começa com um caractere curinga ('% abc ...') a falha do índice mysql se tornará uma operação de varredura completa da tabela
Insira a descrição da imagem aqui

EXPLAIN select * from staffs where name ='july'
EXPLAIN select * from staffs where name like '%july%'
EXPLAIN select * from staffs where name like '%july'
EXPLAIN select * from staffs where name like 'july%' 

Solução: Índice de cobertura
EXPLIQUE selecione o nome, idade, cargo de equipes onde nome como '% julho%'

Estratégia 9. Citar tipos de caracteres

String sem aspas simples falha no índice
Insira a descrição da imagem aqui
EXPLAIN select * from staffs onde name = 917

Solução: abrangendo o índice EXPLAIN select name, age, post from staffs onde name = 917

Solução: adicione aspas

Estratégia 10. OR para UNION é mais eficiente

Insira a descrição da imagem aqui

EXPLAIN select * from staffs where name='July' or name = 'z3' 
EXPLAIN select * from staffs where name='July' UNION select * from staffs where name = 'z3' 

Solução: Índice de cobertura
EXPLICAR selecione o nome, idade das equipes, onde nome = 'julho' ou nome = 'z3'

Perguntas de teste

Insira a descrição da imagem aqui

Resumo de memória

Resumo da memória:

  • Combate em tempo integral meu favorito, o prefixo mais à esquerda deve ser observado;
  • O irmão líder não pode morrer e o irmão do meio não pode ser quebrado;
  • Menos cálculo na coluna de índice, todos inválidos após o intervalo;
  • LIKE é escrito à direita em porcentagem e o índice de cobertura não é escrito *;
  • Diferente do valor nulo e OR, preste atenção ao impacto do índice;
  • As cotações VAR não podem ser perdidas, a otimização SQL tem um truque.

Importação em lote

Insira a descrição da imagem aqui

inserir otimização de instrução;

  • Desative o envio automático antes de enviar
  • Tente usar instruções de inserção em lote
  • Pode usar o mecanismo de armazenamento MyISAM

LOAD DATA INFLIE

LOAD DATA INFLIE;
usando LOAD DATA INFLIE, 20 vezes mais rápido do que a instrução de inserção geral

 select * into OUTFILE 'D:\\product.txt' from product_info 
 load data INFILE 'D:\\product.txt' into table product_info 
 load data INFILE '/soft/product3.txt' into table product_info
show VARIABLES like 'secure_file_priv'
  • Quando secure_file_priv é NULL, significa que o mysqld está restrito de não permitir importação ou exportação.
  • Quando secure_file_priv é / tmp, significa que mysqld só pode ser importado e exportado no diretório / tmp, e não pode ser executado em outros diretórios.
  • Quando secure_file_priv não tem valor, significa que o mysqld não está restrito a importar e exportar em qualquer diretório. secure_file_priv = ''

responder:
Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/weixin_42292697/article/details/114752985
Recomendado
Clasificación