otimização de desempenho de consulta das limitações otimizador de consulta e dicas

MySQL loop aninhado universal para cada consulta não são ideais. Contudo, MySQL consulta otimizador apenas uma pequena parte da consulta não se aplica a, e muitas vezes get MySQL consulta, podemos reescrever a conclusão eficiente do trabalho.

1 correlacionada subconsulta
MySQL subqueries para alcançar muito ruim. Sub consulta onde as piores condições para uma classe incluída na consulta (). Porque MySQL tem uma estratégia de otimização especial () na lista de opções, tendem a pensar em MySQL vamos primeiro executar sub-consulta retorna todas valores entre () cláusula na consulta. Em geral, na lista de consulta () rápido, portanto, pensei que iria realizar SQL

SELECT * FROM tast_user onde id in ( SELECT id de usuário onde nome como ' Rei%');
nós pensamos que este seria resolvido com a seguinte sql formar
select * from tast_user onde id in ( 1,2,3,4,5);
na verdade é resolvido MySQL
SELECT * de tast_user oNDE EXISTE
(ID de usuário SELECT de WHERE nome like 'Rei%' e tast_user.id o user.id =);
o MySQL será comprimido a uma subconsulta externa relevante mesa, de modo que possa de forma mais eficiente encontrar a linha de dados.

Desta vez devido ao sub-consultas utiliza um campo id tabela externa de modo sub-consultas não pode ser executado em primeiro lugar. Pode ser visto através explin, MySQL primeira escolha para a tabela tast_user varredura completa da tabela, e em seguida, um por um para executar consultas com base em criança id retornado. Se a camada exterior é uma grande mesa, o desempenho desta consulta será muito ruim. Claro, podemos otimizar a tabela escrevendo:

seleccionar tast_user. * tast_user de junção interna utilizador utilizando (tast_user.id) onde user.name como ' % rei'
Outra forma consiste em optimizar a utilização group_concat construído numa lista separados por vírgulas (). Isto é por vezes associado ao uso de reescrever mais rápido do que o anterior. Por causa do uso de () mais sub-queries, o desempenho é geralmente muito ruim. É geralmente recomendado para uso existe () consulta reescrita equivalente a obter uma melhor eficiência.

Como escrever melhor no sub-consulta não é introduzida, porque agora exige basicamente dividido em consultas de mesa única e auto-interessado, então você pode ir sobre o próximo.

2 restrições UNIÃO
pode, MySQL limites inferiores não derivadas a partir da camada interior, o que faz com que seja possível limitar a porção das condições originais retornar para o resultado da optimização não pode ser aplicada para a consulta interna.

Se desejado, a respectiva cláusula de união pode ser tomada de acordo com o limite parcial conjunto de resultados apenas, ou para ser capaz de mesclar o conjunto de resultados ordenado, então é necessário utilizar estas cláusulas são cada cláusula da união. Por exemplo, queremos unir os dois resultados sub-consultas, e em seguida, tomar a 20 antes, então o MySQL irá ser duas tabelas são armazenadas em uma tabela temporária, em seguida, remova as primeiras 20 linhas.

(Selecione FIRST_NAME, last_name do ator Ordenar por last_name) Tudo União
(selecione FIRST_NAME, LAST_NAME da ordem do cliente, last_name) 20 é limite;
gravar esse ator iria consultar a tabela de clientes e todos levados para fora em uma mesa temporária em seguida, a 20 a partir do anterior, respectivamente, pela adição de duas sub-consultas em um limite de 20 a reduzir os dados na tabela temporária.

Agora no meio de tabela temporária irá conter apenas 40 registros, dos outros do que o desempenho considerações, há também precisa prestar atenção a uma coisa, a fim de recuperar os dados da tabela temporária não é certo, por isso, se você deseja obter a ordem correta, também precisa adicionar ordem por operação de uma organização global

terceiro índice de optimização combinado
secções anteriores já mencionado, o acesso a uma única MySQL índices da tabela a uma pluralidade de filtragem combinadas e necessidade transversal para encontrar formas de localizar uma linha.

4 equivalente a transferência de
algum ponto, a transferência equivalente trará alguns extras inesperados consumido. Por exemplo existe uma grande lista de (), e MySQL optimizador encontrado onde / ou utilizar em cláusula, uma coluna estará associado com isso lista de valores e uma mesa.

O otimizador estará em () listas são atribuídos a cada aplicação na tabela associada. Tipicamente, cada tabela como os novos critérios de filtro, o optimizador pode mais engraçado filtrado a partir do motor de armazenamento de gravação. Mas se a lista for muito grande, ele vai levar a otimização e execução vai abrandar.

5 paralelo execução
MySQL incapaz de tirar proveito de multi-core características de execução de consulta paralela. Muitos outro banco de dados relacional Eng capaz de fornecer esse recurso, mas o MySQL não pode fazer. Particularmente apontou aqui que gostaria de lembrá-lo não tomar o tempo para tentar encontrar maneiras de executar a consulta em paralelo.

6 associação Hash
em 20,113 anos MySQL não executa associação de hash, são todos associação lacetes MySQL associado aninhados. Mas pode levar a curva de realização de hash associado Se você estiver usando motor de memória, o índice é um índice hash, então, quando a associação também é semelhante ao de hash associados através do estabelecimento de um índice hash. Além disso MariaDB foi alcançado associação de hash.

7 índice solta varredura
devido a razões históricas, o MySQL não suporta a verificação de índice solta, de acordo com o índice não será capaz de digitalizar de forma descontínua. Normalmente, o índice MySQL necessidade de digitalização de definir um ponto de partida e foco, mesmo que os dados só precisa de um muito poucos neste índice, MySQL ainda precisa fazer a varredura do índice do segmento para cada entrada.

Exemplo: existente índice (a, B)

SELECT * ONDE a partir da Tabela 2 e B entre 3;.

Como o índice de campo de verificação é um, mas apenas especificado no campo de consulta b, MySQL pode não usar este índice, de modo que apenas pela Total varredura da tabela para encontrar as linhas correspondentes. ,

MySQL varredura completa da tabela:



compreender a estrutura da fraqueza do índice, também pode ser difícil encontrar um caminho mais rápido para executar o consulta acima. armazenamento incapacidade estrutura índice motor não é uma API torna possível para fazer a varredura de uma gama de b coluna na primeira linha correspondente ao valor, e então saltar para uma coluna diferente da segunda gama de valores correspondentes para o varrimento da coluna b



, neste momento, não há necessidade de usar o onde filtro cláusula, porque uma varredura de índice solta cancelou todos os registros indesejados.

A descrição acima é um exemplo simples, um processo de verificação de índice solto, uma nova lata índice de curso também adequado para optimizar a consulta acima. Mas para algumas cenas, o aumento do índice é inútil, por exemplo, pela primeira solidão é condição faixa dividida, a segunda divisão Solitude é equivalente a enviar consultas para construir, através do aumento do índice não irá resolver o problema.

Depois MySQL5.6, algumas restrições sobre a verificação de índice solta iria assustar indexado por condição de derivação é resolvido.

8 valores máximos e mínimos optimizados
para MIN () e MAX () consultas, optimização MySQL não boa, por exemplo:

min seleção (A actor_id) do Ator ONDE FIRST_NAME = 'Wang'
Porque no campo first_name e nenhum índice, por isso MySQL irá realizar uma verificação de tabela completa. Se o MySQL é capaz de digitalizar uma chave primária, então, teoricamente, quando o MySQL ler o primeiro registro que satisfaz as condições também, é o mínimo que precisamos, porque a chave primária é estritamente de acordo com o tamanho do irmão do campo de classificação actor_id. Mas MySSQL só então fazer verificação de tabela cheia, nós podemos verificar por meio de uma mesa cheia de status de digitalização contra show dessa. Uma solução de optimização é condado para remover a função min (), em seguida, usar o limite de consulta 1.

Esta estratégia permite MySQL para verificar a quantidade de registros tão pouco quanto possível. Este exemplo nos que as vezes para alcançar um desempenho superior, você tem que desistir de algumas princípios diz.

9 consultas e atualizações na mesma tabela
MySQL não permitir que a mesma tabela para consulta e atualização ao mesmo tempo. Isto não é otimizador limites, se claro como MySQL está executando a consulta, é possível evitar essa situação. Exemplo:

Actualizar Tabela SET CNT = (SELECT COUNT (*) como TB de mesa onde tb.type = table.type);
o SQL Embora um único padrão não pode ser realizada, podemos contornar as limitações acima usando uma forma de tabela gerada, porque o MySQL só irá colocá esta tabela como uma tabela temporária para lidar com eles.

Inner a Junte-se à actualização da tabela
(o SELECT do tipo, COUNT (*) AS cnt da tabela pelo Grupo do tipo) como um usando TB (do tipo)
o SET table.cnt = tb.cnt;
na verdade ele realizou dois inquéritos: um é o sub-consulta selecione declaração, o outro é a atualização relacionada NRL, a tabela somente quando associada a uma tabela temporária. Sub-consulta é concluída antes da instrução de atualização abre a tabela, ele será executado corretamente.

Dica 10 otimizador (sugestão)
Se você plano escolhido pelo otimizador não está satisfeito, você pode usar o otimizador fornece diversos sugestões (sugestão) para controlar o plano de implementação do definitiva. A seguir estão algumas dicas comum, e simplesmente dado quando usar as dicas. Ao adicionar uma resposta rápida na consulta, você pode controlar o plano de execução para à consulta.

① HIGH_PRIORITY e LOW_PRIORITY

este prompt diz MySQL, quando o acesso simultâneo múltiplas para uma lista de instruções, que declarações de prioridade relativamente maior, que a prioridade declarações é relativamente baixo.

tempo HIGH_PRIORITY para a instrução SELECT, o MySQL irá reagendar essa instrução SELECT para todas as tabelas estão bloqueados para que frase antes de as alterações de dados. MySQL é efectivamente colocado para a frente da tabela da fila, em vez de esperar em uma sequência convencional. HIGH_PRIORITY também pode ser usado para inserir a declaração, o efeito é simplesmente o efeito do mundial escola de esportes configuração LOW_PRIORITY o comunicado.

LOW_PRIORITY Pelo contrário, ele vai fazer a declaração está em um estado de espera, enquanto não há acesso para a mesma mesa na fila, ele terá que esperar na cauda. Ele pode ser usado em declarações CRUD.

Estes dois dicas sobre o uso da tabela bloqueia apenas o motor armazenamento eficaz, InnoDB ou não pode ser usado em outros motores têm os mecanismos e o controle de concorrência de grão fino. No MyISAM deve ser usado com cautela, porque estas duas dicas vão levar a inserções concorrentes estão desactivadas, pode seriamente o desempenho degrade.

HIGH_PRIORITY LOW_PRIORITY ea de fato simplesmente uma ordem da fila de controlo de acessos a uma tabelas de dados MySQL.

② ATRASO

Esta dica é válida para inserir e substituir. MySSQL vai usar a instrução de prompt retorna imediatamente à cliente e linhas inserido no buffer, e, em seguida, grava os dados em lotes em que a tabela é livre. sistemas de registro usando essas dicas são muito eficazes, ou outros grandes quantidades de dados precisam ser escritas, mas que o cliente não precisa esperar a conclusão de um aplicações única instrução I / O. Este uso tem algumas limitações. Nem todos os motores de armazenamento apoiar, e as causas imediatas da função LAST_INSERT_ID () não trabalho.

③ STRAIGHT_JOIN

esta dica pode ser evitado após a selecione select chave podem ser prevenidas entre dois nomes de tabela associados. O primeiro é fazer uso de todas as tabelas na consulta associados com a ordem em que aparecem no comunicado. A segunda regra é associada a uma seqüência fixa antes e depois as duas tabelas.

Quando o MySQL Não escolhi a ordem correta das relevância - ou quando eles ordem muito devido a possíveis causas mysql não pode avaliar toda a sequência associado, STRAIGHT_JOIN serão úteis em MySQL poderá emitir uma grande quantidade de tempo em estatísticas do estado, mais esta dica irá reduzir muito a otimizador busca espaço

④ SQL_SMALLRESULT e SQL_BIG_RESULT

este pedido só é válido para duas instruções select. Contaram grupo ou consultas otimizador por distintas sobre como usar a tabela temporária e tipo. SQL_SMALL_RESULT dizer ao otimizador que o resultado é muito pequeno rali, o resultado pode ser colocado na memória temporária da tabela de índice para evitar ordenação operação. Se SQL_BIG_RESULT, dirá o otimizador que o conjunto de resultados podem ser muito grandes, é recomendado o uso de uma tabela temporária de fazer operações de disco de classificação.

⑤ SQL_BUFFER_RESULT

Essa dica informa que o otimizador os resultados da consulta em uma mesa temporária e depois desbloquear rapidamente as mesas o máximo possível. Isto resulta do cache do cliente acima mencionado diferente. Quando você não pode usar o cache do cliente, o cache usando server-side é geralmente muito eficaz. Os benefícios sem consumir muita memória no cliente, mas também para desbloquear as mesas mais rapidamente possível. O custo do servidor exigirá mais memória.

⑥ SQL_CACHE ea SQL_NO_CACHE

se esse aviso informa conjunto de resultados do MySQL deve ser colocado no cache de consultas.

⑦ SQL_CALC_FOUND_ROWS

irmão Yan, este não é um sugestões de optimização. Ele não diz nada sobre o plano de execução otimizador. Ele vai fazer MySQL retorna o conjunto de resultados contém mais informações. O MySQL consulta além de prompt irá calcular o número total de conjuntos de resultados após esta cláusula para limitar a consulta para ser devolvido, mas na verdade o valor retornado requisitos limite de conjunto de resultados. Este valor pode ser obtido por um found_row função (). Cuidado, viria a explicar porquê.

⑧ FOR UPDATE e LOCK IN SHARE MODE

, isso não é verdade sugestões de optimização. Isto levou dois mecanismos principais de controle de bloqueio de instrução SELECT, mas apenas eficaz para alcançar o mecanismo de armazenamento de bloqueio em nível de linha. Use as dicas irá coincidir com as linhas de bloqueio de consulta. Para inserir / select não é necessário porque essas duas pontas será o padrão para esses registros após 5.0 mais um bloqueio de leitura.

O suporte só construiu tanto motor de alerta é InnoDB, você pode desativar o comportamento padrão. Também tenha em mente que algumas dessas dicas não irá funcionar devidamente otimizado, por exemplo, um índice que abrange a verificação. InnoDB não é exclusivo para bloquear em uma linha sem acessar a chave primária, as informações de versão é armazenada como linhas na chave primária.

Se essas duas dicas são frequentemente abusadas, é fácil manhã bloqueio servidor contenção.

⑨ USE INDEX, IGNORE INDEX e FORCE INDEX

estas dicas vão dizer o otimizador a usar ou não usar esses índices para registro de consulta.

Acrescido de alguns parâmetros na versão 5.0 para controlar o comportamento otimizador:

① optimizer_search_depth

este parâmetro controla os limites otimizador no plano de execução exaustiva. Se a consulta é muito tempo nas estatísticas estaduais, você pode considerar a redução este parâmetro.

② optimizer_prune_level

Este parâmetro é ativado por padrão, o que torna o otimizador irá decidir se a ignorar alguns do plano de implementação com base no número de linhas a serem verificados.

③optimizer_switch

Esta variável contém um número de ligar / desligar características bandeira optimizer.

Usado para controlar o otimizador pode tomar alguns atalhos quando os dois primeiros parâmetros. Esses atalhos podem fazer o otimizador quando se lida com instruções SQL muito complexas podem ser mais eficientes, mas também pode permitir que o otimizador para perder algumas plano de execução verdadeiramente ideal, assim que o cuidado.

Modificar otimizador dicas podem fazer a atualização após a nova versão da estratégia de otimização MySQL falhar, eles devem ser cuidadosos
---------------------
Autor: yongqi_wang
Fonte: CSDN
Original: https : //blog.csdn.net/yongqi_wang/article/details/86527819
Aviso: Este artigo é um artigo original blogger, reproduzido, por favor anexar ligação Bowen!
Publicou 966 artigos originais · ganhou elogios 11 · vê 30000 +

Acho que você gosta

Origin blog.csdn.net/xiaoyaGrace/article/details/105270571
Recomendado
Clasificación