Otimização de classificação MySQLSQL

Um, princípio de classificação do MySQL

1.1 Como o MySQL lida com as operações de classificação?

1) Quando o campo de classificação em SQL pode usar efetivamente o índice, seja uma consulta de tabela única ou uma consulta associada a várias tabelas, por meio da ordenação do índice, podemos classificar e recuperar rapidamente a ordem por campo.

2) Quando o campo de classificação em SQL não pode usar efetivamente o índice:

  a. Para consulta de tabela única, selecione "um algoritmo de varredura" ou "algoritmo de varredura de duas passagens" de acordo com a situação específica para varrer e classificar

  b. Para consulta associativa de várias tabelas, se o campo de classificação for uma tabela de controle, o conjunto de resultados da tabela de controle será classificado primeiro e, em seguida, o conjunto de resultados ordenado será associado à tabela de controle e o conjunto de resultados será retornado ; se o campo de classificação for Tabela controlada, só pode esperar pelo conjunto de resultados depois que a tabela controlada for associada à tabela controlada e, em seguida, o conjunto de resultados é classificado.

3) Para todas as operações de classificação, o MySQL usará preferencialmente a memória para classificação. O tamanho do buffer de classificação da memória é controlado pelo parâmetro sort_buffer_size. Quando o conjunto de resultados classificado excede o limite de sort_buffer_size, o MySQL irá ler o conjunto de resultados em lotes no buffer de classificação para classificação. Em seguida, armazene o conjunto de resultados classificados em uma tabela temporária de disco e assim por diante, e finalmente todos os conjuntos de resultados classificados são mesclados e classificados e devolvidos ao cliente. Este método de classificação também é chamado de "mesclagem multi-way", que pode ser observado O parâmetro de status do banco de dados Sort_merge_passes julga seu uso e consumo.

1.2 Dois algoritmos de classificação e varredura:

1) Um algoritmo de varredura

  Leia todas as colunas de consulta e as colunas de classificação no buffer de classificação para classificação de uma vez e retorne o conjunto de resultados ao cliente.

2) Algoritmo de varredura de duas passagens

  Primeiro leia a coluna de classificação e sua coluna de chave primária no cache de classificação para classificação, retorne à tabela novamente de acordo com a coluna de chave primária classificada para consultar outras informações de coluna necessárias e retornar o conjunto de resultados ao cliente.

1.3 Metodologia de otimização de classificação

  • Priorizar o uso de índices e índices de cobertura, e usar a ordem dos índices para classificação;
  • Na classificação associativa de várias tabelas, tente priorizar o uso de índices para classificar as tabelas de controle;
  • O efeito da classificação dos campos da tabela controlada é geralmente o pior. Neste momento, é impossível otimizar a classificação pelo índice. Tente considerar como minimizar o tamanho do conjunto de resultados que precisa ser classificado;
  • Quando o parâmetro de status Sort_merge_passes no banco de dados de consulta SQL continua a mostrar uma tendência ascendente, o tamanho do parâmetro sort_buffer_size pode ser ajustado apropriadamente para reduzir o consumo de recursos da tabela temporária do disco na fusão de múltiplas vias.

2. Métodos de otimização de classificação

2.1 Use o índice para otimizar o pedido por limite

1. SQL a ser otimizado

SELECT yongHuID, zhengJianLX, shenFenZH, yongHuKL, yongHuMing
	, yongHuLB, xueXiaoID, kaoDianID, zhuCeFS, zhuCeLY
	, shouJiHao, qQ, email, weiXinHao, zhuCeSJ
	, wenTi, daAn, xinXiYT, freezeFlag, mobileAuthFlag
	, fingerPasswd, useFlag, enableFlag, noAuthmobileNo, artCardFlag
	, extStr, idCardNoAuthFlag, postAuth, tipPhone, kaoShiID
	, kaoShiMC, isDeleted, createdBy, createdOn, modifiedBy
	, modifiedOn
FROM us_user_users
WHERE isDeleted = 0
ORDER BY createdOn DESC
LIMIT 15

2. Método de otimização e efeito de otimização

Crie um índice no campo de classificação createdOn campo, idx_email ( createdOn)

No plano de execução otimizado, você pode ver que o SQL pode usar efetivamente o índice e a linha de varredura é relativamente pequena.
[Falha na transferência da imagem do link externo. O site de origem pode ter um mecanismo de link anti-leech. Recomenda-se salvar a imagem e carregá-la diretamente (img-GdZw9sgA-1616312500769) (http://note.youdao.com/yws/ res / 81658 / FEE4BFA8B91946BB9EA16619A05C9ADC)]

3. Resumo

Para algumas consultas de ordem por limite de consultas de tabela única, o otimizador de banco de dados MySQL geralmente prioriza a otimização de classificação por meio do índice de ordem por campo. Quando a condição where não tem maior capacidade de filtragem, essa abordagem geralmente é melhor; quando a condição where tem melhor capacidade de filtragem, a prioridade é dada à condição where para otimização da filtragem condicional. Desde a versão MySQL 5.7.33, este comportamento pode ser controlado pelo prefer_ordering_index no parâmetro optimizer_switch para otimizar a ordem por limite. prefer_ordering_index é ativado por padrão, indicando que o MySQL dará prioridade à otimização da classificação por meio do índice de ordem por coluna.

2.2 Classificar apenas a mesa da unidade

1. SQL a ser otimizado

SELECT p.product_id, p.sale_at
FROM snapshot_product snap
    STRAIGHT_JOIN product p
    ON snap.product_id = p.product_id
        AND p.status = 3
        AND p.enabled = 1
WHERE snap.promotion_id = 504
GROUP BY snap.`product_id`
ORDER BY p.product_id ASC
LIMIT 12800, 200 

Como você pode ver no plano de execução, a consulta SQL atual classifica o conjunto de resultados após a tabela ser associada e produz uma classificação de disco, e o consumo geral de recursos é muito grande.
[Falha na transferência da imagem do link externo. O site de origem pode ter um mecanismo de link anti-leech. Recomenda-se salvar a imagem e carregá-la diretamente (img-jMpA1iyp-1616312500791) (http://note.youdao.com/yws/ res / 81670 / 76BA92720B0E495C9220B2860FECEE70)]

2. Plano de otimização e efeito de otimização

Como snap.product_id = p.product_id, vamos alterar a ordem de p.product_id asc para a ordem de snap.product_id asc para otimizar e deixar o SQL classificar a tabela da unidade por índice.

SQL após a otimização:

SELECT p.product_id, p.sale_at
FROM snapshot_product snap
    STRAIGHT_JOIN product p
    ON snap.product_id = p.product_id
        AND p.status = 3
        AND p.enabled = 1
WHERE snap.promotion_id = 504
GROUP BY snap.`product_id`
ORDER BY snap.product_id ASC 
LIMIT 12800, 200

Como você pode ver no plano de execução, depois de alterarmos a sequência de classificação do SQL para a tabela do drive, porque o índice composto de (promotion_id, product_id) existe na tabela do drive, o índice pode ser usado efetivamente para classificação. O SQL evita completamente o consumo de recursos causado pela classificação. O desempenho de execução do SQL será bastante melhorado.
[Falha na transferência da imagem do link externo. O site de origem pode ter um mecanismo de link anti-leech. Recomenda-se salvar a imagem e carregá-la diretamente (img-GZKGZRv7-1616312500795) (http://note.youdao.com/yws/ res / 81672 / B96AAD17889A4AD691164CFCA217F983)]

3. Resumo

Na otimização da classificação por associação de tabelas, os principais pontos de otimização considerados são:

1) Use o índice para otimizar a seleção de pequenas tabelas como a mesa de controle;
2) Tente considerar a classificação das colunas da mesa de controle, e a classificação pode usar efetivamente o índice para a otimização da classificação; claro, mesmo que a mesa de controle não possa usar efetivamente o índice para classificação, geralmente será melhor do que É melhor classificar o conjunto de resultados da tabela temporária depois que a tabela controlada for associada à tabela controlada.

2.3 Classificação temporária da tabela

A classificação temporária da tabela geralmente significa que a consulta SQL deve classificar o conjunto de resultados da tabela controlada e da tabela controlada. Se o conjunto de resultados exceder o tamanho de sort_buffer_size, haverá uma operação de alto consumo de classificação de disco, que é nossa otimização SQL Uma situação a evitar.

1. SQL a ser otimizado

SELECT macm.version
FROM b2b_mhc_area_city_map macm
	LEFT JOIN b2b_mhc_area ma
	ON macm.area_id = ma.area_id
		AND ma.status = 1
WHERE macm.area_id > 23
	AND ma.biz_type = 1
ORDER BY ma.version DESC

2. Método de otimização e efeito de otimização

Para a classificação temporária da tabela, só podemos usar as condições do filtro where para minimizar o tamanho do conjunto de resultados que precisa ser classificado para otimização. O plano de execução é o seguinte:

[Falha na transferência da imagem do link externo. O site de origem pode ter um mecanismo de link anti-leech. Recomenda-se salvar a imagem e carregá-la diretamente (img-6czFM1nW-1616312500803) (http://note.youdao.com/yws/ res / 81674 / DB93CA1C419241A499A63FFCDDA2611A)]

3. Resumo

O uso de tabelas temporárias para classificação ocorre apenas quando envolve classificação associativa de várias tabelas. Quando a consulta é para classificar um campo da tabela controlada, o conjunto de resultados da associação de tabelas deve ser obtido e colocado em uma tabela temporária, e a tabela temporária é usada para classificação Este método de classificação é o menos eficiente. O que podemos otimizar é passar as condições do filtro o máximo possível para reduzir a quantidade de dados que precisam ser classificados na tabela temporária.

2.4 Use o índice de cobertura para otimizar a classificação

1. Teste de construção de dados

如表中存在复合索引(a1,a2,a3)
CREATE TABLE `tt5` (
  `a1` int(11) DEFAULT NULL,
  `a2` int(11) DEFAULT NULL,
  `a3` int(11) DEFAULT NULL,
  `a4` int(11) DEFAULT NULL,
  KEY `idx_a123` (`a1`,`a2`,`a3`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

mysql> select * from tt5;
+------+------+------+------+
| a1   | a2   | a3   | a4   |
+------+------+------+------+
|    1 |    1 |    2 |    3 |
|    1 |    2 |    3 |    4 |
|    1 |    2 |    4 |    1 |
|    2 |    2 |    4 |    1 |
|    2 |    4 |    1 |    5 |
|    4 |    3 |    1 |    5 |
|    4 |    4 |    1 |    2 |
|    3 |    4 |    1 |    2 |
|    3 |    4 |    8 |    2 |
|    5 |    4 |    8 |    2 |
|    5 |    2 |    1 |    2 |
|    5 |    2 |    7 |    0 |
|    5 |    3 |    7 |    0 |
+------+------+------+------+
13 rows in set (0.00 sec)

2. A situação em que o índice de cobertura pode ser usado para classificação:

Select a1 from tt5 order by a1;
Select a2 from tt5 where a1>1 order by a1;
Select a2 from tt5 where a1=1 order by a2;
Select a2 from tt5 where a1=1 order by a2,a3;
Select a2 from tt5 where a1=1 and a2>3 order by a2;
Select a2 from tt5 where a1=1 and a2>3 order by a2,a3;

3. A situação em que o índice de cobertura não pode ser usado para otimização:

Select a2 from tt5 where a1=2 order by a3;                  //不满足(a1,a2,a3)
Select a2 from tt5 where a1=2 and a2>3 order by a3;
Select a2 from tt5 where a1=1 order by a2 asc,a3 desc;
Select a2 from tt5 where a1=1 order by a2,a4;
Select a2 from tt5 where a1=1 and a2 in (1,2) order by a3;
Select a2 from tt5 where a1>1 order by a2;

Acho que você gosta

Origin blog.csdn.net/weixin_37692493/article/details/115050308
Recomendado
Clasificación