Не использовал семейство MySQL в течение многих лет. Теперь нужно перейти с OracleDB на MariaDB или PostgreSQL.
Так что на подобном "железе" (Openstack VM: RHEL 7.3
, 4HT cores of 2.5GHz Xeon E312xx
, "local" SAN & SATA storage
) получил Oracle11g
и MariaDB10.3
бок о бок.
Создал простой набор таблиц из 10 столбцов с числовым первичным ключом и без индексов, триггеров и т. Д. Приложение java (hibernate + jdbc) с 1 потоком и 1 подключением, выполняющее всего 6 вставок в цикле (с фиксацией каждые 100 циклов).
Я либо делаю что-то не так, либо слишком ожидаю производительности MariaDB, но в OracleDB эта процедура занимает 348 мс / цикл (6 * 100 вставок + фиксация), в MariaDB то же самое занимает 3291 мс / цикл, другими словами примерно в 10 раз медленнее, чем OracleDB на том же оборудовании (все, что я переключаю в приложении Java, - это диалект гибернации и URL-адрес подключения / пользователь / пароль). Я дважды проверил с помощью tcpdumps, что приложение работает с одинаковой производительностью, так сильно отличается время ответа от БД.
Учитывая то, что я вижу до сих пор - следует ли мне просто снизить ожидания производительности MariaDB или лучше продолжить копаться в трассировке IOwait или тонкой настройке MariaDB? Просто нигде не мог найти ссылку на то, какой будет "нормальная" производительность для MariaDB (на некотором эталонном оборудовании) ... 5 + мс / вставка просто кажется "слишком много" ...
Обновить:
Нашел статья:
показывая их
PrepareStatementBatch100InsertPrepareHit.mariadb
(выполнение партии из 1000 вставок) завершение за 5 мс, так что около 5 МИКРО (!) секунд на вставку ....
Кажется, наша установка работает примерно в 1000 раз медленнее, чем ожидалось ...
Обновление 2
Перемещен с Openstack VM на «голый» эквивалент (все те же параметры, за исключением того, что процессор представляет собой 4HT ядра Xeon E5450 @ 3GHz). Установил OracleDB и MariaDB с настройками по умолчанию, перенес схемы.
В MariaDB на «голом железе» «6 * 100 INSERT + фиксация» занимало 430 мс / цикл, что полностью сопоставимо с OracleDB (также совершенно хорошо в том смысле, что делать это с помощью простого jdbc / PreparedStatements без какой-либо пакетной обработки - вполне приемлемо). То же самое с "6 * 100 DELETEs + commit" - 625 мс / цикл. Теперь единственная оставшаяся проблема, с которой я столкнулся, - это медленное выполнение SelectForUpdates / UPDATE.
Следующая смесь (то же самое, что выполняется приложением и, следовательно, выбрана в качестве микростенда) на MariaDB:
для сравнения на OracleDB Openstack VM:
На данный момент - исчерпаны очевидные / задокументированные оптимизации и попробовали некоторые нелогичные тесты, такие как отключение любого разделения / индексов / внешних ключей / и т. Д.