Никогда не используйте MySQL, всегда используйте PostgreSQL

от автора

И вот почему: по результатам нагрузочного тестирования

  • PostgreSQL в два раза меньше потребляет ресурса CPU,

  • PostgreSQL в два раза меньше потребляет ресурса RAM,

  • PostgreSQL в полтора раза меньше потребляет ресурса HDD (storage),

  • PostgreSQL в три раза быстрее выполняет запросы.

  • PostgreSQL после выполнения команды очистки (TRUNCATE TABLE) полностью очистил диск , MySQL очистил диск только наполовину.

Тестирование проводилось на настройках по умолчанию, ни какого тюнинга СУБД не было, была использована виртуалка СберКлауда (OS Ubuntu 22), 4 CPU, 6 Gb RAM, 100 GB SSD.

Наверное MySQL надо уметь готовить ? Наверное. Если кто то напишет рецепт в комментариях, то благодарное человечество, в лице меня лично, скажет большое спасибо.

Одновременно с этим есть PostgreSQL, который можно не уметь готовить и иметь большую (такую же?) эффективность, стоит ли связываться с MySQL ?

Тут я хочу передать привет Битриксу, который по умолчанию идёт на MySQL, но если заморочиться, то можно использовать PostgreSQL, используйте PostgreSQL, не пожалеете.

Подробности тестирования читайте ниже, будут картинки.

Картинки

Сначала картинки.

Первые две картинки наверное сразу объяснят в чём проблема у MySQL и какой проблемы нет у PostgreSQL. Проблема эта называется эффективность использования ввода вывода.

MySQL I/O Utilization

MySQL I/O Utilization

Как видим MySQL использует ресурс пропускной способности ввода/вывода на 100%, наверное это не очень хорошо, даже наверное MySQL упирается в потолок и ему не хватает скорости, для MySQL нужен диск побыстрей.

Теперь посмотрим на PostgreSQL.

PostgreSQL I/O Utilization

PostgreSQL I/O Utilization

Использование ввода/вывода растёт от 15% до 20%. Для PostgreSQL можно использовать более медленные диски.

Вывод

Наверное именно поэтому PostgreSQL быстрее отработал тестовую программу, потому что операции ввода/вывода занимали в разы меньше времени. Все остальные показатели это производные от этой особенности в работе PostgreSQL.

Посмотрим другие картинки.

CPU

mysql cpu utilization

mysql cpu utilization

MySQL в среднем 45%, значительная доля это ожидание ввода/вывода.

pg cpu utilization

pg cpu utilization

PostgreSQL в среднем 25%, ожидание ввода/вывода занимает не значительную долю.

RAM

mysql ram utilization

mysql ram utilization

MySQL на всём протяжении теста около 1 гигабайта.

pg ram utilization

pg ram utilization

PostgreSQL в два раза меньше — 512 мегабайт.

HDD (Storage)

mysql hdd utilization

mysql hdd utilization

MySQL , от 5% до 30% в конце теста и до 20% после TRUNCATE TABLE, то есть сами данные заняли 10%, а ещё 15% (20% в конце минус 5% в начале) не понятно чем забились. Кто знает ответ ? Пожалуйста, напишите в комментариях.

pg hdd utilization

pg hdd utilization

PostgreSQL, от 4% до 19%, и после TRUNCATE TABLE осталось 5%, не пойми что заняло 1%, сами данные и индекс 15%, у MySQL это было 10%, возможно что MySQL не удалил индекс, а PostgreSQL индекс удалил вместе с таблицей, поэтому PostgreSQL освободил на 5% больше места.

Длительность выполнения тестового сценария

Длительность видно по всем картинкам, приблизительно это для PostgreSQL 1 час, для MySQL 3 часа.

Разницы в ТРИ раза !

При этом в среднем один прогон для

  • PostgreSQL в начале один прогон был 31 секунду, в конце 35,

  • Для MySQL время возрастало от 48 секунд и по нарастающей до 212.

PostgreSQL время вставки выросло не значительно, при том что был создан индекс по колонкам REGION и ID и поскольку прогоны повторялись, то 99 раз надо было вставлять одно и то же сочетание REGION и ID в ранее добавленные позиции индекса. То есть индекс всё время пересчитывался, и это мало сказалось на времени выполнения вставки каждой новой записи (+13%).

По MySQL рост на 341%, от 100% (48 секунд) до 441% (212)

Тестовый сценарий

В качестве нагрузки для СУБД был выбран импорт базы ФИАС в формате ГАР (XML файлы).

Сто прогонов с вставкой по 400 000 записей за прогон. Была использована только одна таблица — ADDR_OBJ — адресные объекта, это все компоненты адреса имеющие собственное имя, то есть это регионы, населённые пункты, улицы.

Пример записи:

    <OBJECT ID="765" OBJECTID="733" OBJECTGUID="88582cfc-5bc1-4ac5-93f8-ad4c7cb84334" CHANGEID="1883" NAME="Ветеранов"             TYPENAME="ул" LEVEL="8" OPERTYPEID="1" PREVID="0" NEXTID="0" UPDATEDATE="2014-01-05" STARTDATE="1900-01-01"             ENDDATE="2079-06-06" ISACTUAL="1" ISACTIVE="1"/>

Метрики измеряли с помощью prom/node-exporter:latest.

Метрики собирались с помощью prom/prometheus:latest с разрешением 5 секунд

Метрики рисовались с помощью grafana/grafana-enterprise

Скрипт теста был написан на PHP (php8)

PostgreSQL был установлен с помощью команды

apt install postgresql postgresql-contrib

Версия 16 точно, возможно 17.

MySQL был установлен с помощью команды

apt install mysql-server

Версия MySQL наверное 8, какая минорная не скажу. А вдруг MySQL 5 ?? Проверить версию мне в голову как то не пришло, извините.

Ещё диска не хватило и пришлось его расширять, был на 10 забиля после 50-ти прогонов, увеличил до 100. Как увеличивал, добавлю в статью позже. Это полезная инструкция.

Disclaimer

Может быть если бы тест был про вставку в несколько таблиц и и не только вставку, но и выборки данных и обновление данных и происходило это всё более хаотично, то результаты не были бы настолько шокирующими. Возможно 🙂

Кто то может быть может дать ссылки на адекватные бенчмарки, не такие как это однобокое нечто ?

Пожалуйста поделитесь вашим мыслями и мнением в комментариях. Особенно если вы гуру MySQL, или собаку съели на тюнинге СУБД, поделитесь опытом.

PS

Код тестового стенда можно посмотреть на GitHub

Если хотите повторить мои опыты, то пишите в мессенджеры (есть в профиле), подскажу как настроить конфиги, а главное подскажу где (в исходниках) лежит скрипт развёртывания базы данных (таблицы и схемы), и где взять базу ФИАС, это тоже важно 🙂

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

Для своих проектов в качесте реляционной СУБД я выбираю:

31.03% MySQL45
46.9% PostgreSQL68
26.21% SQLite38
13.79% я не выбираю, уже выбрали, за меня20
10.34% MongoDB15
5.52% JSON8
15.17% кг/ам (кто то ещё помнит как это расшифровывается? напишите в комментариях!)22
4.14% афтор, пиши исчо6

Проголосовали 145 пользователей. Воздержался 21 пользователь.

ссылка на оригинал статьи https://habr.com/ru/articles/857966/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *