Eu li de um arquivo de configuração de amostra que diz o seguinte:
# Sort buffer is used to perform sorts for some ORDER BY and GROUP BY
# queries. If sorted data does not fit into the sort buffer, a disk
# based merge sort is used instead - See the "Sort_merge_passes"
# status variable. Allocated per thread if sort is needed.
Eu tenho algumas consultas que usam filesort. Como determino qual é o tamanho do buffer necessário para que as consultas sejam executadas sem problemas, sem atingir o disco?
Respostas:
Há apenas uma variável de status que se preocupa com sort_buffer_size . É isso que você tem na mensagem de volta à pergunta: Sort_merge_passes . A documentação do MySQL diz:
Lembre-se de uma coisa sobre o sort_buffer_size
Embora o aumento
sort_buffer_size
possa ajudar as consultas comGROUP BY
s eORDER BY
s, é melhor melhorar as consultas e adicionar índices que podem ser usados pelo Query Optimizer.A pergunta permanece: Como você verifica os Sort_merge_passes ???
Use esse código para verificar quantas Sort_merge_passes ocorreram nos últimos 5 minutos. Ele também calcula o Sort_merge_passes por hora.
Se você encontrar o Sort_merge_passes e a taxa muito alta, fique à vontade para aumentar o sort_buffer_size . Suponha que você queira aumentar para 4M. Você executaria isso:
Você adicionaria isso ao my.cnf
Você executaria o código periodicamente para verificar outras vezes os picos de Sort_merge_passes .
fonte
Você não precisa alterar o sort_buffer_size do padrão. Você entende mal o seu uso com base na pergunta. Você deve começar examinando o SQL para ver se é capaz de ajustá-lo e satisfazer as condições ORDER BY / GROUP BY usando um índice. Geralmente será um índice composto.
Além disso: http://www.xaprb.com/blog/2010/05/09/how-to-tune-mysqls-sort_buffer_size/
fonte
.cnf
arquivos de amostra enviados com o mysql não usam a configuração padrão.As orientações no manual (5.0-5.5) são
A partir da versão 5.6, o texto indica que o otimizador pode escolher um valor para uma consulta e que o servidor pode estender o buffer até o limite. Isso reduz o custo de definir o valor muito alto. Parece que você pode querer ser conservador, menor que o padrão (como os arquivos cnf da versão) para versões abaixo da 5.6.4, mas pode ter um limite maior de dizer os 2 MB padrão, ou até mais, da versão 5.6. 4, pois o valor total não é cego.
fonte
A melhor maneira de determinar o ideal
sort_buffer_size
é compará-lo.Quão? Como o @RolandoMySQLDBA disse que a verificação
Sort_merge_passes
pode ser útil, mas esse não é o único fator que afeta o desempenho. Você deve ter cuidado ao aumentar osort_buffer_size
.O documento diz que
Há um post sobre o teste que conclui que
Quando testei, também obtive um resultado semelhante.
Idealmente, seria melhor evitar a situação que você precisa para otimizar o
sort_buffer_size
. Quão? Este documento de ORDEM POR Otimização pode ajudá-lo a entender como as coisas funcionam sob o capô.fonte
"mysql> SET GLOBAL sort_buffer_size = 1024 * 1024 * 4;" é uma maneira ruim de colocar em 4m o tamanho do buffer de classificação, isso faz com que o tamanho do buffer de classificação use 4 GB
"mysql> SET GLOBAL sort_buffer_size = 1024 * 4;"
Se eu sou seu, não tento alterar o tamanho curto do buffer, é uma boa maneira de travar o servidor e enviar para o desempenho do lixo. É melhor tentar fazer consultas melhores.
fonte
1024 * 4
. Isso é 4096, 4K.