Пару дней назад по мировой технологической прессе распространился пиар 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 работает примерно как режим
Итак, что же получается в итоге? MemSQL работает в 500 раз медленнее в режиме надёжных транзакций.
В режиме чтения MemSQL способна сканировать 8 млн строк в секунду по запросу
SELECT * FROM table ORDER BY id DESC LIMIT 5;
Такой запрос встречается повсюду, он показывает топы разных списков. MySQL выполняет его, нормально перемещаясь по индексу от записи к записи, в то время как MemSQL вынуждена перемолоть всю таблицу целиком и отсортировать её заново для выполнения запроса. Даже запрос
Итак, MemSQL в тысячу раз медленнее MySQL, или в миллион раз медленнее. На простых запросах на чтение.
В общем, Домас Митузас делает вывод, что MemSQL — отличная разработка и быстрейший протокол MySQL из существующих, для некоторых задач, но он не так уж сильно опережает MySQL Cluster, да и разработчики NDB Cluster тоже заявляют об очень высокой производительности. Однако, MemSQL нуждается в правильной оптимизации для более типичных паттернов использования.
Представители 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 нуждается в правильной оптимизации для более типичных паттернов использования.