#mysql #performance #innodb #myisam
#mysql #Производительность #innodb #myisam
Вопрос:
Конечно, для транзакционной базы данных InnoDB — это верняк. MyISAM не поддерживает транзакции или блокировку на уровне строк.
Но что, если я хочу выполнять большие пакетные запросы, которые затрагивают сотни миллионов строк?
Есть ли области, в которых MyISAM имеет относительное преимущество перед InnoDB??
например, один (незначительный), о котором я знаю … «выберите count (*) из my_table»; MyISAM знает ответ на это мгновенно, тогда как InnoDB может потребоваться минута или больше, чтобы принять решение.
— Дэйв
Ответ №1:
MyISAM лучше масштабируется с очень большими наборами данных. InnoDB превосходит MyISAM во многих ситуациях, пока не перестанет сохранять индексы в памяти, тогда производительность резко упадет.
MyISAM также поддерживает таблицы слияния, что является своего рода сегментированием «для бедных». Вы можете мгновенно добавлять / удалять очень большие наборы данных. Например, если у вас есть 1 таблица за рабочий квартал, вы можете создать таблицу слияния за последние 4 квартала, или за определенный год, или в любом диапазоне, который вы хотите. Вместо экспорта, удаления и импорта для перемещения данных, вы можете просто повторно объявить базовое содержимое таблицы СЛИЯНИЯ. Изменение кода не требуется, поскольку имя таблицы не меняется.
MyISAM также лучше подходит для ведения журнала, когда вы только добавляете в таблицу. Подобно таблицам СЛИЯНИЯ, вы можете легко поменять местами (повернуть «журналы») таблицу и / или скопировать ее.
Вы можете скопировать файлы БД, связанные с таблицей MyISAM, на другой компьютер и просто поместить их в каталог данных MySQL, и MySQL автоматически добавит их в доступные таблицы. Вы не можете сделать это с InnoDB, вам нужно экспортировать / импортировать.
Все это конкретные случаи, но я воспользовался каждым из них несколько раз.
Конечно, при репликации вы могли бы использовать оба варианта. Таблица может быть InnoDB на главном сервере и MyISAM на подчиненном. Структура должна быть одинаковой, а не тип таблицы. Тогда вы можете получить лучшее из обоих. Тип таблицы BLACKHOLE работает таким образом.
Комментарии:
1. «InnoDB на главном и MyISAM на ведомом» — точно. Это моя текущая настройка. Мой мысленный эксперимент — InnoDB против MyISAM для того подчиненного устройства, которое обслуживает только запросы только для чтения, которые, как правило, являются одноранговыми и затрагивают множество строк. Сейчас я использую MyISAM, но я не уверен, что это дает мне что-то еще, кроме быстрого подсчета строк.
2. Таблицы слияния интересны. Это по сравнению с разделенными таблицами. Похоже, что секционированные таблицы более строго применяют семантику, поддерживая уникальные ключи во всех разделах. «Более свободная» семантика «осколка бедняка» может быть более подходящей для некоторых сценариев. Мне придется немного подумать об этих компромиссах.
Ответ №2:
Вот отличная статья, в которой сравниваются различные показатели производительности http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1 — вам придется оценить это с нескольких точек зрения, включая то, как вы собираетесь писать свои запросы и как выглядит ваша схема. Это просто не черно-белый вопрос.
Комментарии:
1. Эта статья полностью посвящена OLTP. Каждый график имеет «количество подключений» в качестве оси x. Для моих сценариев «количество подключений» == 1. И все запросы являются одноранговыми.
Ответ №3:
Согласно этой статье, начиная с версии 5.6, InnoDB был разработан до такой степени, что он лучше во всех сценариях. Автор, вероятно, немного предвзят, но он четко описывает, какая технология рассматривается в качестве будущего направления платформы.