Является ли обычной практикой смешивать таблицы InnoDB и MyISAM на одном сервере?


21

У меня есть одна база данных объемом около 4,5 ГБ, работающая на сервере с 8 ГБ ОЗУ. Подавляющее большинство таблиц - MyIsam (около 4,3 ГБ), но вскоре я собираюсь преобразовать некоторые из них в InnoDB. (Это будет медленный процесс, фокусирующийся сначала на таблицах с наибольшей интенсивностью записи).

Что-то не так с запуском выделенного сервера, на котором существуют оба типа механизмов хранения?


Is there anything wrong with running a dedicated server where both types of storage engines exist? Может быть перефразировать Multiple types?
Джон

Единственная причина, по которой я сказал «оба», заключается в том, что этот вопрос касается двух основных движков, которые настроены на «точную настройку». Я пытаюсь игнорировать другие типы движков, такие как MEMORY или MERGE, которые достаточно редки, так что afaik не являются объектом настройки производительности.
Дерек Дауни

Ответы:


18

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

Например, если у вас небольшая таблица, в которой 90% записей, вы можете выбрать MyISAM. Если данные можно легко восстановить и это небольшая таблица, скажем, для очередей, вы можете выбрать Память. Если у вас есть таблица, которая на 90% читает, и данные должны быть там, когда вы ее ищете, то вы, вероятно, выбрали бы механизм хранения, который поддерживает транзакции и настраиваемую атомарность, например InnoDB. Если вы хотите получить доступ через файловую систему без повреждения данных, вы можете выбрать CSV.

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

Позвольте мне отметить, что ваши буферы играют роль во всем этом беспорядке. Если вы используете и MyISAM, и InnoDB, вам нужно быть осторожным, чтобы ваши key_buffer и innodb_buffer_pool не конкурировали. Это потребует тщательного планирования с вашей стороны, но это то, что мы делаем.


4
+1 Другим распространенным вариантом использования является MyISAM для таблиц, требующих полнотекстового поиска, и InnoDB для всех других таблиц.
Асаф

@Aseph: даже во время вашего комментария, InnoDB поддерживал полнотекстовые индексы .
BlueRaja - Дэнни Пфлюгофт

2
^^^^ «Возможности MySQL 5.6» не было GA до 2013-02-05
randomx

1
@randymelder Хороший ответ. Сможете ли вы уточнить, что вы имели в виду под «Вы должны быть осторожны, чтобы ваши key_buffer и innodb_buffer_pool не конкурировали»?
Neel

1
Я хочу доказать, что ошибаюсь, но логика выглядит здесь противоположно этому stackoverflow.com/a/6796566/5645769 .
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ

7

Я не могу сказать вам, если это обычная практика. Я могу сказать о своем собственном опыте.

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

Когда мне нужны специальные функции, доступные только на InnoDB, я делаю это.

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

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

В прошлом я видел некоторые замедления, смешивающие MyISAM и InnoDB, но это не является специфической проблемой MySQL. Это проблема дизайна, которая не проявляется, когда вы используете только один двигатель. На самом деле использование неправильного движка приводит к большему замедлению, не имеет значения, является ли это просто MyISAM, просто InnoDB или их комбинацией. Трудно определить формулу, чтобы знать, когда произойдет замедление. Только реальные тесты могут сказать это вам.

Конечно, вы не можете сохранить целостность и согласованность, смешивая InnoDB и MyISAM в одном запросе.


Механизм архивации не поддерживает индексирование, так почему вы храните его в архиве.
user4951

0

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


Как вы можете иметь внешние ключи при использовании MyISAM?
a_horse_with_no_name

Неправильная терминология, но работает как внешний ключ. Я сохраняю идентификационный номер элемента из таблицы InnoDB и использую его для поиска страницы в результатах поиска.
Кензо
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.