Нужно ли переходить с MyISAM на InnoDB?

MySQL

Автор: Александр Степанов

1 нояб. 2011 г., 09:50:31  1728


Автор: Peter, Percona
Перевод: Vladimir Rusinov

Существует значительная часть проектов, которые используют MyISAM и задаются вопросом, стоит ли им перейти на InnoDB, или же лучше продолжить использовать MyISAM?

Я предпочитаю Innodb в качестве основного движка, потому что для большинства пользователей это делает жизнь намного проще — не приходится беспокоиться о восстановлении таблиц после сбоя, таблицы не блокируются целиком, «горячие» бекапы делать гораздо проще, но есть несколько вещей о которых нужно подумать перед принятием решения о переходе.

MyISAM используется по умолчанию, или это был осмысленный выбор? Это самый главный вопрос. Иногда MyISAM используется только потому что он выбран по умолчанию. В других случаях это намеренный выбор для системы, которая учитывает ограничения MyISAM. В таком случае должен быть хороший аргумент для перехода на Innodb.

Готовность приложения. Приложение должно быть готово для работы с Innodb. К примеру, оно должно быть готово к возникновению дедлоков, которые в Innodb могут случаться даже если вы не используете транзакции, но никогда не случаются в MyISAM. Разумеется перед переходом нужно тщательно протестировать приложение.

Производительность. Innodb предлагает очень много для производительности: как улучшения, так и регрессии производительности. В качестве улучшений мы обычно видим кеширование данных, более высокий параллелизм, фоновая запись на диск, ухудшения — увеличение размера таблиц, обычно более медленная запись, более медленная обработка BLOB'ов, проблемы с работой с очень большим количеством таблиц, медленная загрузка данных и ALTER TABLE, и другие проблемы. Наверное самая известная — низкая производительность COUNT(*) без WHERE, исправление этой проблемы требует модификации приложения.

Операции. То, что хорошо для MyISAM — плохо для Innodb. Очень важно чтобы все в команде понимали Innodb и знали как работать с ним, или хотя бы имели возможность узнать это. Кроме того, нужно проверить насколько хорошо рутинные процессы работают с Innodb. Например, бинарное копирование таблицы с одного из слейвов на машину разработчиков работает нормально в MyISAM и не работает в Innodb. Некоторые утилиты для бекапа (например mysqlhotcopy) не работают, другие вещи могут оказаться намного медленнее с Innodb, например бекап взятый с помощью mysqldump может достаточно быстро восстанавливаться на MyISAM, но очень медленно на Innodb.


Функциональность. Некоторые функции, доступные в MyISAM не доступны в Innodb. Например, полнотекстовый поиск и RTREE индексы. Есть обходные пути для исправления этого, например можно сделать MyISAM-слейв необходимых таблиц, но это конечно же нужно иметь в виду.

Что насчет использования и MyISAM и Innodb? Конечно, это возможно, но нужно использоваться аккуратно, т.к. это усложняет такие задачи как бекапы, балансировка и анализ производительности. Кроме того, это может осложнить жизнь оптимизатору запросов — ему сложнее учитывать стоимость операций в разных движках.

Я предпочитаю выбрать один движок (обычно Innodb), а другой движок использоваться только там где это дает очень хорошие результаты. Я не буду конвертировать таблицу в MyISAM если это не увеличивает производительность более чем на 5%, но определенно буду использовать MyISAM для хранения логов и подобного.

Innodb требует настройки. На самом деле. MyISAM во многих случаях работает достаточно хорошо и с настройками по умолчанию. Я встречал множество гигабайтных баз данных, которые вполне нормально работали со стандартными настройками.


Оригинал: «Should you move from MyISAM to Innodb ?», MySQL Performance Blog