После очередного топика на Хабре в стиле "Но ведь все сколько-нибудь компетентные вебдевелоперы знают, что надо использовать движок InnoDB" решил написать обзор.
Впервые с проблемами блокировки я столкнулся сравнительно давно, еще лет 8 назад. Примитивный счетчик загрузок, в котором через UPDATE обновлялось поле cnt , отлично работал. Когда на проекте увеличилась посещаемость, mysql начал дико тормозить. Просмотр процессов показал, что висит множество SELECT запросов к этой таблице. Так я узнал, что UPDATE на время исполнения лочит всю MyISAM таблицу и самое быстрое решение проблемы, сковертировать таблицу в InnoDB. Но поскольку мне нужен был полнотекстовый поиск, пришлось пойти другим путем. Вынести частые обновления в промежуточную таблицу типа MEMORY. А основную обновлять изредка по cron-у.
Разбираемся с чем есть MyISAM.
Не поддерживает транзакции и с этим связаны его основные недостатки и преимущества
- В большинстве случаев он быстрее, так как нет расходов на транзакции
- Занимает меньше дискового пространства
- Меньше расход памяти на обновления
- Полнотекстовый индекс
- Быстрый INSERT, SELECT
InnoDB
- Поддержка транзакций
- Построчная блокировка. UPDATE не блокирует всю таблицу.
- Отлично ведет себя при смешанной нагрузке (insert|select|update|delete)
Подведем итог, ответив на вопрос в заголовке, MyISAM или InnoDB?
Если прочитав все выше, вы так и не решили, что выбрать, то лучше первое. В остальном, универсального решения нет, все зависит от задачи.
Если у вас приложение типа OLAP то выбирайте MyISAM, если OLTP, то — InnoDB.
Свежие комментарии