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

 

Автор: 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

InnoDB

>Я не буду конвертировать таблицу в MyISAM если это не увеличивает производительность более чем на 5%, но определенно буду использовать MyISAM для хранения логов и подобного.

Я всегда думал, что InnoDB надо использовать, когда много инсертов в таблицу. В случае логов - именно так и есть, но Вы говорите, что использовали бы MyISAM. Что я не так понял?

Много инсертов - это

Много инсертов - это однозначно MyISAM. Если много апдейтов/делетов - Innodb.
Это потому что INSERT - простая операция, делается достаточно быстро, и в MyISAM она не обременена всякими сложностями Innodb (транзакционность, write ahead и пр), поэтому выполняется гораздо быстрее в MyISAM.

>>Я всегда думал, что InnoDB

>>Я всегда думал, что InnoDB надо использовать, когда много инсертов в таблицу
Много инсёртов и много селектов, тогда конечно выигрывает innodb, т.к не блочит всю таблицу, а для логов, которые явно читаются не так часто, myisam гораздо выгоднее в скорости записи.

А при селекте разве блочится

А при селекте разве блочится таблица?

При селекте - блочится на

При селекте - блочится на запись, при инсерте - на чтение.

RTFM!

RTFM!

в innodb блокировка на уровне

в innodb блокировка на уровне записи, а в myisam на уровне таблиц. отсюда и плюсы и проблемы.

Тема не раскрыта. InnoDB и

Тема не раскрыта. InnoDB и как развитие - переход на Postgres (при нагруженных базах) нужен когда связи между таблицами имеют большое значение. Например в корпоративном интранет-приложении. Для удобного каскадного удаления и соблюдение совместимости данных. В очень простых независимых связях можно обходится и с MyIsam.

Кстати. Добавьте валидацию на .name домены

> Я всегда думал, что InnoDB

> Я всегда думал, что InnoDB надо использовать, когда много инсертов в таблицу. В случае логов - именно так и есть, но Вы говорите, что использовали бы MyISAM. Что я не так понял?

Глупости. Если одна-единственная программа работает с базой данных то MyISAM лучше.
А вот когда множество подключения различных приложений, то тут нужно смотреть. Прежде всего как много делается чтений и записей.

Дело в том что MyISAM блокирует таблицу целиком. Если чтений не много то это не страшно.

А есть ли способы локально под win быстро делать импорт innodb?

А есть ли способы локально под windows быстро делать импорт innodb баз данных? Подскажите кто знает решение?

Пример: дамп MyISAM базы через mysqlldump импорт выполнятеся за 5-7 минут
а дамп Innodb базы через mysqlldump импорт выполнятеся более чем за час

что очень не удобно, как импортировать бд Innodb быстро?

auto commit выключи

auto commit выключи

На мой взгляд для абсолютного

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

Придерживаюсь той же точки

Придерживаюсь той же точки зрения. InnoDB боле актуально для высоких нагрузок и специфичных задач с транзакциями.

> Много инсёртов и много

> Много инсёртов и много селектов, тогда конечно выигрывает innodb, т.к не блочит всю таблицу

Не угадали. В MyISAM инсерты не блокируют чтение!!!
Второй момент, наводящий на всех ужас - блокировки таблицы целиком: в MyISAM эти блокировки происходят гоооораздо быстрее, т.к. не перегружены наворотами транзакционности.

innodb (а еще лучше XtraDB, как улучшенный innodb, см. MariaDB) необходимо использовать когда необходимы транзакции (сюда же попадает и контроль целостности с помощью тех же внешний ключей), а также ситуации когда в базе много апдейтов и тяжелые (длительные) селекты.

Большинства тормозов в MyISAM можно избежать если проектировать базу с учетом сильных и слабых сторон этого движка. Плюс, сам движок позволяет ускорить многие вещи (напр. операции с DELAYED и т.п.).

Плюс, зачастую необходимо прикидывать расход оперативной памяти сервера (с MyISAM это будет в разы меньше, чем с InnoDB).

Так что выбор между этими движками не так прост как кажется. А тут еще на подходе движок Aria (см. MariaDB - так теперь называется MySQL в исполнении его изначальных разработчиков, которые ушли из SUN и Oracle развивать мускул)...

PS: ну и завсегда очень полезно иногда перечитывать раздел Оптимизации MySQL из штатной документации.

С наступающим Новым годом!

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
КАПЧА