MySQL в миллион раз быстрее MemSQL

в 22:22, , рубрики: innodb, MemSQL, mysql, маркетинг, тесты производительности, метки: , , , ,

Пару дней назад по мировой технологической прессе распространился пиар MemSQL — базы данных нового поколения от Никиты Шамгунова (shamg), которая якобы показывает скорость в 30 раз выше, чем MySQL и при этом «надёжна по дефолту» (durable by default), как сказано у них на сайте.

Представители MySQL не снизошли до ответа на эти очевидные маркетинговые лозунги. Но вот бывший сотрудник MySQL, Домас Митузас (Domas Mituzas), ныне специалист по базам данных в Facebook и Wikipedia, всё-таки не выдержал и решил разобраться, как именно нас обманывают — и ответить тем же, то есть показать примеры, где MemSQL работает в сотни, тысячи и даже миллион раз медленнее, чем MySQL.

Главный тезис о «30-кратном приросте производительности», как выяснилось, выведен из тестов производительности MySQL с параметрами по умолчанию против MemSQL с параметрами по умолчанию. Здесь уже начинается читерство, потому что системы вынуждены работать совершенно в разных окружениях: например, буфер памяти в MemSQL, фактически, ничем не ограничен, а в InnoDB он установлен на 128 МБ в MySQL 5.5 (и это в 16 раз больше, чем в 5.1).

Для бенчмарков записи сравнивается MemSQL с логами транзакций 2 ГБ и InnoDB с логами по 10 МБ.

В то же время для любых бенчмарков, пишет Домас Митузас, важна надёжность. В то время как InnoDB реально проверяет, что транзакции сохранены на диск, «надёжность по дефолту» MemSQL означает всего лишь, что запись занесена в лог транзакций, но на самом деле это не гарантирует, что она сохранится на диске. Транзакционный буфер MemSQL работает примерно как режим innodb_flush_log_at_trx_commit=2. Если же включить полную защиту транзакций в MemSQL, то это будет душераздирающее зрелище: фоновый процесс просыпается каждые 50 мс для записи лога транзакций.

Итак, что же получается в итоге? MemSQL работает в 500 раз медленнее в режиме надёжных транзакций.

В режиме чтения MemSQL способна сканировать 8 млн строк в секунду по запросу SELECT COUNT(*), это великолепный результат. Но вот запрос:

SELECT * FROM table ORDER BY id DESC LIMIT 5;

Такой запрос встречается повсюду, он показывает топы разных списков. MySQL выполняет его, нормально перемещаясь по индексу от записи к записи, в то время как MemSQL вынуждена перемолоть всю таблицу целиком и отсортировать её заново для выполнения запроса. Даже запрос SELECT MAX(id) приводит к сортировке всей таблицы целиком.

Итак, MemSQL в тысячу раз медленнее MySQL, или в миллион раз медленнее. На простых запросах на чтение.

В общем, Домас Митузас делает вывод, что MemSQL — отличная разработка и быстрейший протокол MySQL из существующих, для некоторых задач, но он не так уж сильно опережает MySQL Cluster, да и разработчики NDB Cluster тоже заявляют об очень высокой производительности. Однако, MemSQL нуждается в правильной оптимизации для более типичных паттернов использования.

Автор: alizar


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js