Узкое место InnoDB :Ослабление ACID для повышения производительности

Заметив, что наша база данных стала основным узким местом в наших реальных производственных системах, я решил создать простой тест, чтобы разобраться в сути проблемы.

Эталонный тест :Я определяю, сколько времени требуется для увеличения одной и той же строки в таблице InnoDB 3000 раз, где строка индексируется по ее первичному ключу, а обновляемый столбец не является частью какого-либо индекса. Я выполняю эти 3000 обновлений, используя 20 одновременных клиентов, работающих на удаленной машине, каждый со своим отдельным подключением к БД.

Мне интересно узнать, почему различные механизмы хранения, которые я тестировал, InnoDB, MyISAM и MEMORY, имеют именно такие профили. Я также надеюсь понять, почему InnoDB так плохо себя чувствует по сравнению с ним.

InnoDB (20 одновременных клиентов ):Каждое обновление занимает 0,175 с. Все обновления сделаны после 6.68s.

MyISAM (20 одновременных клиентов ):Каждое обновление занимает 0,003 с. Все обновления выполняются через 0,85 с.

Память (20 одновременных клиентов ):Каждое обновление занимает 0,0019 с. Все обновления выполняются после 0.80s.

Подумав, что такое поведение может быть вызвано параллелизмом, я также проверил один клиент, последовательно выполняющий 100 обновлений.

ИнноДБ :Каждое обновление занимает 0,0026 с.

MyISAM :Каждое обновление занимает 0,0006 с.

ПАМЯТЬ :Каждое обновление занимает 0,0005 с.

Фактическая машина представляет собой экземпляр Amazon RDS(http://aws.amazon.com/rds/)с настройками по умолчанию.

Я предполагаю, что ответ будет примерно следующим: :InnoDB fsyncs после каждого обновления (, так как каждое обновление является транзакцией, совместимой с ACID ), тогда как MyISAM не поддерживает, поскольку он даже не поддерживает сделка.MyISAM, вероятно, выполняет все обновления в памяти и регулярно сбрасывает на диск, поэтому его скорость приближается к механизму хранения MEMORY. Если это так, то есть ли способ использовать InnoDB для поддержки транзакций, но, возможно, ослабить некоторые ограничения (с помощью конфигураций ), чтобы записи выполнялись быстрее за счет некоторой надежности?

Кроме того, какие-либо предложения по улучшению производительности InnoDB по мере увеличения числа клиентов? Он явно масштабируется хуже, чем другие механизмы хранения.

Обновление

Я нашелhttps://blogs.oracle.com/MySQL/entry/comparing_innodb_to_myisam_performance, это именно то, что я искал. Установка innodb -flush -log -в -trx -commit=2 позволяет нам ослабить ограничения ACID (сброс на диск происходит один раз в секунду )в случае сбоя питания или происходит сбой сервера. Это дает нам поведение, аналогичное MyISAM, но мы по-прежнему можем пользоваться функциями транзакций, доступными в InnoDB.

Запустив те же тесты, мы видим 10-кратное улучшение производительности записи.

InnoDB (20 одновременных клиентов ):Каждое обновление занимает 0,017 с. Все обновления выполняются после 0,98 с.

Есть еще предложения?

12
задан BrainCore 5 May 2012 в 02:54
поделиться