Производительность версии MySQL измеряется временем отклика, пропускной способностью запросов и масштабированием под нагрузкой. В этой статье я использую реальные бенчмарки, чтобы показать, как MySQL 5.7, 8.0, 8.4, 9.1 и 9.2 работает под нагрузкой. Скорость и масштабируемость и какие шаги по настройке стоит предпринять.
Центральные пункты
- Версия select: 8.0+ значительно лучше масштабируется при высоком параллелизме.
- QPS-Усиление: до +50% против 5,7 с увеличением количества нитей.
- 8.4/9.xцеленаправленная оптимизация записи и JOIN.
- Тюнинг: Правильно установите параметры буферного пула, потоков, сортировки и журнала.
- ТестыУбедитесь, что собственный sysbench работает на целевом оборудовании.
Основы производительности MySQL
Я сосредоточился на основных темах, которые делают MySQL быстрым: Запросы, индексов, памяти и ввода-вывода. InnoDB получает значительные преимущества благодаря хорошему управлению буферами, чистому дизайну схемы и точным стратегиям индексов. Современные версии снижают накладные расходы планировщика и улучшают работу бинлога, что сокращает время ожидания. Я измеряю измеримые эффекты, особенно в планах JOIN, сканировании индексов и управлении потоками. Если вам нужна производительность, отдайте предпочтение Схема и конфигурации перед обновлением оборудования.
MySQL 5.7 против 8.0: масштабирование и QPS
При низком уровне параллелизма 5.7 обеспечивает хорошую производительность, но при увеличении числа потоков Масштабирование 8.0 выдерживает более высокий параллелизм и часто увеличивает QPS для OLTP-нагрузок на 30-50% по сравнению с 5.7. Нисходящие индексы позволяют избежать файлового сортирования и заметно ускоряют чтение. Наибольший прирост я наблюдаю в операциях со строками InnoDB и смешанных транзакциях чтения/записи. Однако увеличение пропускной способности обходится немного дороже CPU, что обычно остается приемлемым на современном оборудовании.
8.0 Предприятие против сообщества: что показывают контрольные показатели
В измерениях Sysbench версия 8.0.35 Enterprise часто достигает 21-34% более высоких показателей. QPS чем в версии для сообщества. Преимущество достигается за счет оптимизации внутренних структур и лучшей работы с потоками. В ранних версиях 8.0 иногда наблюдались регрессии с DELETE/UPDATE, которые были устранены более поздними патчами. Поэтому я учитываю уровни патчей и специально тестирую критические запросы. Если вы масштабируете систему предсказуемым образом, вы рассчитываете добавленную стоимость в сравнении с более высокими CPU-Решения по загрузке и изданию.
Прогресс в 8.4 и 9.x с первого взгляда
В версиях 8.4.3 и 9.1.0 изменения в отслеживании зависимостей binlog значительно увеличивают нагрузку на запись, примерно +19,4% для обновлений. Оптимизация JOIN (+2,17%) и улучшенное сканирование диапазона индексов (+2,12%) добавляют дополнительный выигрыш. По многим рабочим нагрузкам я вижу примерно +7,25% для записи и +1,39% для чтения. 9.1.0 лишь незначительно (≈0,68%) отстает от 8.4.3, но приближается к 8.0.40. В сценариях, подобных TPC-C, 9.2 часто рассматривается как Масштабируемый и постоянно, особенно после 128 потоков.
| Версия | Основное преимущество | Типичная прибыль | Ремарка |
|---|---|---|---|
| 5.7 | Низкий Concurrency | - | Прост в управлении, плохо масштабируется при высокой нагрузке. |
| 8.0 | Спуск Индексы, лучшие нитки | +30-50% QPS против 5,7 | Более высокая загрузка процессора, явные преимущества при работе с OLTP. |
| 8.4.3 | Оптимизированная зависимость от бинлога | Пишет +7,25% | Дополнительные преимущества при использовании JOIN и сканирования диапазона. |
| 9.1.0 | Тонкая настройка на Оптимизатор и протоколирование | ≈-0,68% против 8.4.3 | Близко к 8.4.3; результаты совпадают. |
| 9.2 | Высокие номера резьбы | Топ с >128 нитями | Очень хорошо Масштабирование при работе с высокой нагрузкой. |
Я использую эту таблицу для принятия решений: сначала объем работы, затем версия, затем тонкая настройка. Те, кто работает с преобладанием записи, почувствуют 8.4/9.x сильнее. Приложения с преобладанием чтения уже получают заметные преимущества от 8.0. Для стабильного роста 9.2 остается беспроигрышным вариантом. Что остается важным, так это чистота стратегия измерения для целевого оборудования.
Читайте и правильно используйте эталоны OLTP
Я оцениваю бенчмарки не изолированно, а в контексте моих собственных целей по задержке и пропускной способности. Чтение только для чтения, выбор точек и чтение-запись ведут себя по-разному и требуют разного анализа. интерпретация. Пики QPS убедительны только в том случае, если 95-й/99-й процентили остаются стабильными. В производственных нагрузках часто сочетаются короткие SELECT с интенсивными фазами UPDATE/INSERT. Начальные шаги по оптимизации приведены в компактном документе Советы по тюнингу, прежде чем копнуть глубже.
Тюнинг: конфигурация с эффектом
Я установил Буферный пул обычно около 70% доступной оперативной памяти, чтобы горячие данные оставались в памяти. parallel_query_threads я использую контролируемо, потому что слишком большой параллелизм заманчив, но ограничивает зависимости. sort_buffer_size я увеличиваю по мере необходимости и избегаю глобальных преувеличений. Настройки бинлога и стратегии промывки влияют на задержку и Пропускная способность заметно. Я измеряю каждое изменение, прежде чем продолжить вращение, что обеспечивает воспроизводимость Эффекты.
Рычаги конфигурации, на которые часто не обращают внимания
- Повторить/отменить:
innodb_log_file_sizeиinnodb_redo_log_capacityчтобы контрольные точки не нажимались слишком часто и не превышали время восстановления. Для фаз записи я рассчитываю с >4-8 ГБ redo в качестве отправной точки и проверяю с помощью измерений уровня redo. - Смыв/ИО:
innodb_flush_neighborsотключена на современных SSD/NVMe,innodb_io_capacity(_max)к реальным IOPS, чтобы LRU-флеш не происходил волнами. - Буфер изменений: для многих записей вторичных индексов Изменить буфер помогают; проверьте с помощью мониторинга, действительно ли они снижают или смещают давление.
- Таблицы Tmp:
tmp_table_sizeиmax_heap_table_sizeразмерность так, чтобы частые мелкие сортировки оставались в оперативной памяти; оптимизируйте крупные редкие сортировки, а не раздувайте их глобально. - Объединение/сортировка:
размер_буфераиразмер_буфератолько умеренно, потому что они распределяются по потокам. Я оптимизирую сначала индексы/планы, а буферы - в последнюю очередь. - Долговечность:
sync_binlog,innodb_flush_log_at_trx_commitиbinlog_group_commitосознанно: 1/1 - максимально безопасно, более высокие значения уменьшают задержку с просчитываемым риском.
Системы хранения данных и модели рабочих нагрузок
InnoDB является стандартом, но рабочие нагрузки сильно различаются. Я проверяю, совместимы ли вторичные индексы, FK-ограничения и ACID-функции с реальными Пример использования поддержка. Архивирование старых данных снижает нагрузку на первичные таблицы и сохраняет рабочие наборы небольшими. Для получения справочной информации о двигателях можно использовать компактный обзор, например InnoDB против MyISAM. В конечном итоге важно то, что движок, индексы и запросы вместе образуют единое целое. Профиль результат.
Планируйте пути обновления без риска
Я обновляюсь поэтапно: 5.7 → 8.0 → 8.4/9.x, с проверкой на регрессию. Перед изменением я замораживаю изменения схемы и создаю повторяющиеся Тесты. Затем я сравниваю планы запросов, перцентили и блокировки. Стратегии "сине-зеленого" цвета или отказоустойчивое чтение позволяют сократить время простоя. Те, кто правильно планирует, быстро получат выгоду от новых Характеристики и более высокую эффективность.
Методология мониторинга и тестирования
Я провожу измерения с помощью Sysbench, дополняя метрики из Performance Schema и таких инструментов, как Percona Toolkit. Более решающими, чем высокое среднее значение, являются 95-й/99-й процентили и дисперсия. Анализ дайджеста запросов позволяет выявить дорогостоящие шаблоны до того, как они станут дорогостоящими. Воспроизведение реальных производственных нагрузок дает более полную информацию, чем синтетические тесты. Без непрерывного Мониторинг обновления остаются слепыми.
MariaDB против MySQL: прагматичный выбор
MariaDB 11.4 выигрывает в некоторых сценариях INSERT с преимуществом в 13-36% перед MySQL 8.0. MySQL 8.0 силен в OLTP и при большом количестве потоков, а 9.2 - при >128 потоков. Масштабирование показывает. Я принимаю решение в зависимости от рабочей нагрузки: интенсивная запись с большим количеством мелких транзакций или смешанная OLTP-нагрузка с большим количеством чтений. Обе системы обеспечивают надежные результаты при правильной конфигурации и схеме. Выбор остается вопросом Рабочая нагрузка, Экспертиза команды и дорожная карта.
Стабильность плана, статистика и трюки с индексами
Обновление редко приносит только увеличение пропускной способности, но и новые эвристики оптимизатора. Я обеспечиваю стабильность плана, сознательно контролируя анализы и статистику. Постоянная статистика и обычный АНАЛИЗИРОВАТЬ ТАБЛИЦУ Выполняйте кардинальные задачи с реалистичными значениями. Если распределения данных сильно перекошены, то Гистограммы (в 8.0+) часто больше, чем общие расширения индексов. Для чувствительных запросов я специально устанавливаю Подсказки оптимизатора, но в щадящем режиме, чтобы будущие версии могли продолжать свободно оптимизироваться.
Невидимые индексы Я использую его для проверки эффекта удаления индексов без риска. Функциональные индексы и Сгенерированные столбцы Ускорьте частые фильтры по выражениям или полям JSON и избегайте дорогостоящих операций. filesort/tmp-изменение пути. Я поддерживаю монотонные первичные ключи (AUTO_INCREMENT или варианты UUID, основанные на времени), чтобы разделение страниц и запись вторичных индексов не выходили из-под контроля. Если вы переходите от случайных UUID, измерьте влияние изменения на локальность вставки и Смыв-Последний.
Репликация и обход отказа с упором на производительность
Для высокой скорости записи я выбираю ROW-основанные бинлоги с осмысленной группировкой (групповое обязательство) и измерить компромисс между sync_binlog=1 и 0/100. масштабируется на репликах ведомые_параллельные_рабочие (resp. реплика_параллельных_рабочих) с 8.0+ значительно лучше, если Отслеживание зависимостей работает правильно. В сценариях обхода отказа полусинхронизация ускоряет RTO, но может увеличить задержку - я активирую ее выборочно на критических путях.
Я обращаю внимание на детали: binlog_checksum и сжатие требуют затрат процессора, но экономят IO; binlog_expire_logs_seconds предотвращает рост журнала. На репликах я храню только для чтения строго, чтобы избежать расхождений, и проверить Задержка репликации в качестве защиты от ошибочных массовых обновлений. При пиках нагрузки полезно временно ослабить параметры промывки бинлога, если это позволяют SLO и RTO.
Управление соединениями и потоками
Многие узкие места возникают не в хранилище, а в Обработка соединений. Я держу max_connections реалистичный (не максимальный), увеличить размер_кэша_потока и прежде всего полагаться на Пулы соединений приложения. Я масштабирую короткие и частые соединения с помощью пула, а не с помощью голых номеров соединений. таймаут ожидания и интерактивный_таймаут Я ограничиваю их, чтобы они избегали трупов и наблюдали за Threads_running против. Threads_connected.
При высоком параллелизме я дросселирую выборочно: innodb_thread_concurrency Обычно я оставляю 0 (auto), но вмешиваюсь, если рабочие нагрузки чрезмерно переключают контекст. table_open_cache и table_definition_cache чтобы горячие схемы не открывались постоянно заново. В 8.0+ планировщик выигрывает от более совершенных мьютексов; тем не менее я предотвращаю громогласные стада, благодаря использованию обратного хода приложения и экспоненциального повтора вместо жестких циклов.
Аппаратное обеспечение, ОС и контейнерная реальность
MySQL использует современное аппаратное обеспечение только в том случае, если основа правильная. На NUMA-машинах я распределяю оперативную память (чередую) или привязываю процесс к нескольким узлам, чтобы избежать межузловых задержек. Прозрачные огромные страницы Я деактивирую, свопинг также; планировщик ввода-вывода установлен на нет (NVMe) или. mq-deadline. Я фиксирую масштабирование процессора в соответствии с регулятором производительности, чтобы пики задержек не возникали из-за изменения частоты.
На уровне файловой системы я обращаю внимание на чистое выравнивание и параметры монтирования, а также разделяю binlog, redo и данные, если доступно несколько NVMe. В контейнерах я жестко устанавливаю ресурсы (наборы процессоров, лимиты памяти) и тестирую поведение Fsync на уровне хранилища. Дросселирование Cgroup иначе объясняет предполагаемые „ошибки DB“. Любой виртуализатор проверяет управление прерываниями, кэш записи и контроллер с питанием от батареи - и убеждается, что O_DIRECT на самом деле проходит через него.
Модель данных, наборы символов и эффективность хранения
При обновлении до версии 8.0+ utf8mb4 Стандартный - хорош для совместимости, но индексы и размер строки растут. Я более щедро проверяю длину VARCHAR и специально задаю коллизии, чтобы контролировать затраты на сортировку. Я поддерживаю небольшие типы данных (например. INT вместо BIGINT, по возможности) и использовать GENERATED столбцов, чтобы сделать вычисленные фильтры индексируемыми. Сжатие имеет смысл для очень больших таблиц, если есть бюджет ЦП; в противном случае я получаю больше пользы от сокращения горячих наборов (архивирование, разбиение на разделы), чем от необработанных уровней сжатия.
Первичные ключи - это политика производительности: монотонные ключи способствуют Вставить населенный пункт и уменьшают разделение страниц; случайные ключи увеличивают латентность и усиливают запись. Я регулярно очищаю вторичные индексы - затраты на „приятно иметь“ линейно зависят от нагрузки при записи. Я оцениваю цель и частоту запросов, прежде чем сохранять индексы.
Безопасное тестирование, безопасное внедрение
Я строю релизы поэтапно: Теневой трафик против идентичного экземпляра 8.0/8.4/9.x, затем постепенное изменение трафика (Canary, 5-10-25-50-100%). Я сравниваю планы запросов с помощью дайджест-анализа; в случае отклонений я уточняю, закрывают ли путь регрессии гистограммы, подсказки или индексы. Важный момент: в версии 8.0 появился новый Словарь данных; Прыжки назад к 5.7 практически невозможны - поэтому резервные копии обязательны перед каждым окончательным переходом.
Я имитирую обход отказа, моделирую время перезапуска и поведение репликации в реальной жизни, а также проверяю сохранение журналов на предмет возможной перемотки. Откат Я планирую прагматично: переключение конфигурации, флаги возможностей, быстрый откат к предыдущим сборкам, а не только к версиям БД. И я документирую каждый шаг настройки с помощью метрик - без измерения точек нет эффекта обучения для следующей итерации.
Резюме и руководство по принятию решений
Я могу сказать: 8.0 обеспечивает большой скачок QPS по сравнению с 5.7, 8.4/9.x продвигает запись и JOIN еще дальше. Все, кто планирует использовать более 128 потоков, получат большую выгоду от 9.2 и последовательных Тюнинг. Я добиваюсь самых быстрых результатов с помощью размера буферного пула, подходящих индексов и чистых настроек бинлога. После этого важны дизайн запросов, анализ задержек и путь обновления без сюрпризов. С этой дорожной картой Производительность измеримо и надежно.


