Как определить оптимальный sort_buffer_size?


10

Я прочитал из примера файла конфигурации, который говорит следующее:

# 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.

У меня есть пара запросов, которые используют файловую сортировку. Как определить, какой размер буфера мне нужен, чтобы запросы работали без проблем с диском?


Запускаете ли вы mysqltuner или tuning-primer В этих приложениях вы можете увидеть что-то интересное о вашем my.cnf.
Дэвид Мартинес

Ответы:


14

Существует только одна переменная состояния, которая заботится о sort_buffer_size . Вот что у вас есть в ответном вопросе: Sort_merge_passes . Документация MySQL гласит:

Sort_merge_passes: количество проходов слияния, которые должен был выполнить алгоритм сортировки. Если это значение велико, вам следует рассмотреть возможность увеличения значения системной переменной sort_buffer_size .

Пожалуйста, имейте в виду одну вещь о sort_buffer_size

Если вы видите много Sort_merge_passes в секунду в выходных данных SHOW GLOBAL STATUS, вы можете рассмотреть возможность увеличения значения sort_buffer_size для ускорения операций ORDER BY или GROUP BY, которые нельзя улучшить с помощью оптимизации запросов или улучшенной индексации

Хотя повышение sort_buffer_sizeможет помочь запросам с GROUP BYs и ORDER BYs, вам лучше улучшить запросы, которые вы можете улучшить, и добавить индексы, которые могут использоваться оптимизатором запросов.

Остается вопрос: как вы проверяете Sort_merge_passes ???

Используйте этот код, чтобы проверить, сколько Sort_merge_passes произошло за последние 5 минут. Он также вычисляет Sort_merge_passes в час.

SET @SleepTime = 300;
SELECT variable_value INTO @SMP1
FROM information_schema.global_status WHERE variable_name = 'Sort_merge_passes';
SELECT SLEEP(@SleepTime) INTO @x;
SELECT variable_value INTO @SMP2
FROM information_schema.global_status WHERE variable_name = 'Sort_merge_passes';
SET @SMP = @SMP2 - @SMP1;
SET @SMP_RATE = @SMP * 3600 / @SleepTime;
SELECT @SMP,@SMP_RATE;

Если вы обнаружите, что Sort_merge_passes и скорость слишком высоки, не стесняйтесь увеличивать sort_buffer_size . Предположим, вы хотите повысить до 4М. Вы бы запустить это:

mysql> SET GLOBAL sort_buffer_size = 1024 * 1024 * 4;

Затем вы добавили бы это в my.cnf

[mysqld]
sort_buffer_size = 4M

Вы должны периодически запускать код, чтобы проверять другие времена Sort_merge_passes пики.


2
Это гораздо лучший ответ
Грег

7
@RolanoMySQLDBA вы можете определить «многие» в следующем: «Если вы видите много Sort_merge_passes в секунду»
Тарек

2

Вам не нужно менять sort_buffer_size по умолчанию. Вы неправильно понимаете его использование на основе вопроса. Вы должны начать с изучения SQL, чтобы увидеть, можете ли вы его настроить и удовлетворить условиям ORDER BY / GROUP BY, используя индекс. Как правило, это будет составной индекс.

Далее: http://www.xaprb.com/blog/2010/05/09/how-to-tune-mysqls-sort_buffer_size/


Сожалею, что считаю этот пост едва ли полезным. Это все равно что говорить людям не делать что-то только потому, что вы не эксперт. Как указал первый комментатор, .cnfфайлы примеров, поставляемые с mysql, не используют настройку по умолчанию.
Переполнение вопроса

Если вы прочитаете его еще раз, это также говорит о том, что эксперт уже знает, что не следует менять значение по умолчанию. Образцы .cnf-файлов не должны использоваться или использоваться в качестве хорошей практики. Если вам нужна помощь в создании файла my.cnf, Percona предложит довольно тщательного мастера. tools.percona.com/wizard
eroomydna

2

Руководство в руководстве (5.0-5.5)

Если вы видите много Sort_merge_passes в секунду в выходных данных SHOW GLOBAL STATUS, вы можете рассмотреть возможность увеличения значения sort_buffer_size для ускорения операций ORDER BY или GROUP BY, которые нельзя улучшить с помощью оптимизации запросов или улучшенной индексации. Весь буфер выделяется, даже если он не весь необходим, поэтому его глобальное задание будет больше, чем требуется, что замедлит большинство запросов такого рода. Лучше увеличить его как настройку сеанса, и только для сеансов, которые нуждаются в большем размере. В Linux существуют пороговые значения 256 КБ и 2 МБ, при которых большие значения могут значительно замедлить выделение памяти, поэтому вам следует рассмотреть возможность остаться ниже одного из этих значений. Эксперимент, чтобы найти лучшее значение для вашей рабочей нагрузки.

Начиная с версии 5.6, формулировка указывает, что оптимизатор может выбрать значение для запроса и что сервер может расширить буфер до предела. Это снижает стоимость установки значения слишком высоко. Похоже, вы хотите быть консервативным, ниже, чем по умолчанию (как это делают файлы cnf выпуска) для выпусков под 5.6.4, но вы можете позволить себе иметь более высокий предел, скажем, по умолчанию 2 МБ, или даже больше, от 5.6. 4, так как полная сумма не выделяется вслепую.

Начиная с MySQL 5.6.4, оптимизатор пытается определить, сколько места требуется, но может выделить больше, вплоть до предела.


1

Лучший способ определить оптимальный sort_buffer_size- это сравнить его.

Как? Как и @RolandoMySQLDBA, проверка Sort_merge_passesможет быть полезной, но это не единственный фактор, влияющий на производительность. Вы должны быть осторожны, когда вы увеличиваете sort_buffer_size.

В документе говорится, что

В Linux существуют пороговые значения 256 КБ и 2 МБ, при которых большие значения могут значительно замедлить выделение памяти, поэтому вам следует рассмотреть возможность остаться ниже одного из этих значений.

Там есть пост о тестировании, который заключает, что

sort_merge_passesне так уж и плохо. Установка вашего sort_buffer_sizeдостаточно большого, чтобы было ноль, sort_merge_passesможет быть не оптимальным.

Когда я проверил, я также получил аналогичный результат.

В идеале было бы лучше всего избегать ситуации, которую нужно оптимизировать sort_buffer_size. Как? Этот документ ORDER BY Optimization может помочь вам понять, как все работает под капотом.


-1

"mysql> SET GLOBAL sort_buffer_size = 1024 * 1024 * 4;" Это плохой способ поместить размер буфера сортировки в 4 м, что делает размер буфера сортировки более 4 ГБ.

"mysql> SET GLOBAL sort_buffer_size = 1024 * 4;"

Если я ваш, я не пытаюсь изменить короткий размер буфера, это хороший способ сделать сбой вашего сервера, и отправить в корзину производительность. Лучше попытаться сделать лучшие запросы.


1
Как может произойти большая сортировка в буфере сортировки 4K? Обратите внимание, что вы сказали 1024 * 4. Это 4096, 4K.
RolandoMySQLDBA

Что сказал Роландо ^^. И минимально допустимое значение составляет 32K.
ypercubeᵀᴹ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.