Каковы основные различия между InnoDB и MyISAM?

245

Каковы основные различия между InnoDB и MyISAM?

Илхан
источник
23
Если вам нужен механизм базы данных, используйте InnoDB. Вы не можете сравнить два .
Джереми Стейн
Хотя многие из приведенных ниже ответов верны, они не дают четкого представления, ИМХО. Этот сайт делает, и главное: InnoDB - блокировка на уровне строк, MyISAM - блокировка на уровне таблиц. Это означает, что, вообще говоря, MyISAM будет лучше для OLAP (аналитика, в основном чтение), а InnoDB будет лучше для OLTP (транзакции, в основном запись или, по крайней мере, много записей).
Майк Уильямсон

Ответы:

159

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

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

Итак, подведем итог ( TL; DR ):

  • InnoDB имеет блокировку на уровне строк, MyISAM может выполнять только полную блокировку на уровне таблиц.
  • InnoDB имеет лучшее восстановление после сбоя.
  • MyISAM имеет FULLTEXTпоисковые индексы, InnoDB не было до MySQL 5.6 (февраль 2013).
  • InnoDB реализует транзакции, внешние ключи и ограничения отношений, MyISAM - нет.
poelinca
источник
дорогой сэр, так в конечном счете, что можно использовать? MyISAM или InnoDB? я полностью сбит с толку ... мой сайт использует mysql, и мне нужно решить это.
sqlchild
3
В зависимости от приложения, запишите список с необходимыми вам функциями (например, полнотекстовый поиск, внешние ключи ...) и попробуйте выбрать одну из них (попробуйте оценить каждую функцию, а затем подсчитать оценку). вы не сможете получить их все, но вам решать, что ведьма нужна больше всего.
poelinca
2
Я отредактировал свой пост для уточнения.
Матиас Ликкегор Лоренцен
1
@MathiasLykkegaardLorenzen спасибо, это одна из причин, по которой нам нравится stackexchange
poelinca
от version 5.6.4InnoDB поддерживает FULLTEXTпоиск. dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html
мечтатель
85

Еще одно важное отличие, которое еще не упоминалось, заключается в том, как осуществляется кэширование для каждого механизма хранения.

MYISAM

Основной используемый механизм - это кеш ключей. Он кэширует только индексные страницы из файлов .MYI. Чтобы определить размер кеша ключей, выполните следующий запрос:

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1))
recommended_key_buffer_size FROM
(SELECT LEAST(POWER(2,32),KBS1) KBS
FROM (SELECT SUM(index_length) KBS1
FROM information_schema.tables
WHERE engine='MyISAM' AND
table_schema NOT IN ('information_schema','mysql')) AA ) A,
(SELECT 2 PowerOf1024) B;

Это даст Рекомендуемую настройку для MyISAM Key Cache ( key_buffer_size ) с учетом вашего текущего набора данных ( запрос ограничит рекомендацию 4G (4096M). Для 32-битной ОС ограничение 4GB. Для 64-бит 8GB.

InnoDB

Основным используемым механизмом является буферный пул InnoDB. Он кэширует данные и индексные страницы из таблиц InnoDB, к которым осуществляется доступ. Чтобы определить размер пула буферов InnoDB, выполните следующий запрос:

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,
(SELECT 2 PowerOf1024) B;

Это даст рекомендуемый параметр для размера пула буферов InnoDB ( innodb_buffer_pool_size ) с учетом вашего текущего набора данных.

Не забудьте изменить размер файлов журнала InnoDB (ib_logfile0 и ib_logfile1). Исходный код MySQL ограничивает объединенные размеры всех файлов журнала InnoDB должны быть <4G (4096M). Для простоты, учитывая только два файла журнала, вот как вы можете их размер:

  • Шаг 1) Добавьте innodb_log_file_size = NNN в /etc/my.cnf (NNN должен составлять 25% от innodb_buffer_pool_size или 2047M, в зависимости от того, что меньше)
  • Шаг 2) service mysql stop
  • Шаг 3) rm /var/log/mysql/ib_logfile[01]
  • Шаг 4) service mysql start(ib_logfile0 и ib_logfile1 воссоздаются)

ПРЕДОСТЕРЕЖЕНИЕ

В конце обоих запросов есть встроенный запрос (SELECT 2 PowerOf1024)B

  • (SELECT 0 PowerOf1024) дает настройку в байтах
  • (SELECT 1 PowerOf1024) дает настройку в килобайтах
  • (SELECT 2 PowerOf1024) дает настройку в мегабайтах
  • (SELECT 3 PowerOf1024) дает настройку в гигабайтах
  • Никакие полномочия меньше 0 или больше 3 не принимаются

Эпилог

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

  • Если у вас 2 ГБ ОЗУ и 16 ГБ InnoDB, выделите 512 МБ как innodb_buffer_pool.
  • Если у вас 2 ГБ ОЗУ и 4 ГБ индексов MyISAM, выделите 512 МБ как key_buffer_size.
  • Если у вас 2 ГБ ОЗУ и 4 ГБ индексов MyISAM и 16 ГБ InnoDB, выделите 512 МБ как key_buffer_size и 512 МБ как innodb_buffer_pool_size.

Возможные сценарии бесконечны !!!

Помните, что на что бы вы ни выделяли, оставьте достаточно оперативной памяти для подключений к БД и операционной системы.

RolandoMySQLDBA
источник
Это плохие формулы!
Рик Джеймс
(ой - продолжайте забывать, не может быть параграфов) ... Я добавлю "ответ".
Рик Джеймс
Формулы Роландо для размеров кэша не практичны. - Полномочия 2 не нужны. - 4 ГБ в 32-битной ОС невозможны - и т.д. Вот мое краткое изложение того, как их установить: mysql.rjweb.org/doc.php/memory (Это касается различных других настроек, которые влияют на использование памяти.)
Рик Джеймс
2
@Rick: Степени 2 предназначались для отображения ответов в разных единицах. Doing (SELECT 2 PowerOfTwo) Устанавливает отображение ответа в МБ. Doing (SELECT 3 PowerOfTwo) Устанавливает дисплей в ГБ. (ВЫБРАТЬ 1 PowerOfTwo) Отображается в КБ. (ВЫБРАТЬ 0 PowerOfTwo) Отображается в байтах. Вот что делает (SELECT 2 PowerOfTwo). Поэтому необходимо ТОЛЬКО ОТОБРАЖАТЬ, а не навязывать какие-либо предполагаемые значения в архитектуре.
RolandoMySQLDBA
2
@Rick: Знаете что? Я на самом деле дам вам +1 по двум очень важным причинам. 1) Ваш URL подтверждает, что мой ответ был правильным, поскольку 4 ГБ - это наибольшее число, которое нужно назначить key_buffer_size. 2) Ваш ответ с вашим URL имеет смысл для машин с очень низким объемом памяти. Я дам кредит, где кредит должен.
RolandoMySQLDBA
60

InnoDB предлагает:

  • ACID транзакции
  • блокировка на уровне строк
  • ограничения внешнего ключа
  • автоматическое восстановление после сбоя
  • сжатие таблицы (чтение / запись)
  • пространственные типы данных (без пространственных индексов)

В InnoDB все данные подряд, кроме TEXT и BLOB, могут занимать не более 8000 байт. Полнотекстовая индексация недоступна в InnoDB до MySQL 5.6 (февраль 2013 г.). В InnoDB COUNT(*)s (когда WHERE, GROUP BYили JOINне используется) выполняется медленнее, чем в MyISAM, потому что количество строк не хранится внутри. InnoDB хранит данные и индексы в одном файле. InnoDB использует пул буферов для кэширования данных и индексов.

MyISAM предлагает:

  • быстро COUNT(*)с (когда WHERE, GROUP BYили JOINне используется)
  • полнотекстовая индексация (обновление: поддерживается в InnoDB из MySQL 5.6)
  • меньше места на диске
  • очень высокая степень сжатия таблицы (только для чтения)
  • пространственные типы данных и индексы (R-дерево) (обновление: поддерживается в InnoDB из MySQL 5.7)

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

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

dabest1
источник
5
Я прочитал ваш ответ и сравнил его с другими уже здесь. Ваш единственный упоминать BLOB. Они обычно принимаются как должное. Твой также единственный, кто упоминает myisampack, одного из незамеченных героев быстро читаемых таблиц MyISAM. Ваш +1 сегодня !!!
RolandoMySQLDBA
2
Примером может служить сжатая таблица только для чтения, где вы редко обновляете ее, полностью заменяя таблицу.
dabest1
30

Еще одна вещь: вы можете сделать резервную копию таблиц InnoDB, просто сделав снимок файловой системы. Резервное копирование MyISAM требует использования mysqldump и не обязательно будет согласованным (например, если вы вставляете в родительскую и дочернюю таблицу, вы можете найти только строку дочерней таблицы в вашей резервной копии).

По сути, если у вас есть другая копия данных и вы кешируете ее только в MySQL, например, чтобы разрешить стандартные средства доступа к ней с веб-сайта PHP, то с MyISAM все в порядке (т. Е. Это лучше, чем простой CSV-файл или файл журнала для запросов и одновременный доступ). Если база данных является реальной «главной копией» данных, если вы делаете INSERTи UPDATEиспользуете реальные данные от пользователей, то глупо использовать что-либо, кроме InnoDB, в любом масштабе MyISAM ненадежен и сложен в управлении, вы буду делать myisamchkполовину времени, сводя на нет все приросты производительности ...

(Мой личный опыт: 2-терабайтная БД в MyISAM).

Gaius
источник
29

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


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

Ссылочная целостность

Ссылочная целостность гарантирует, что отношения между таблицами остаются согласованными. Более конкретно, это означает, что когда таблица (например, листинги) имеет внешний ключ (например, идентификатор продукта), указывающий на другую таблицу (например, продукты), когда обновления или удаления происходят в указанной таблице, эти изменения каскадно связаны со связыванием Таблица. В нашем примере, если продукт переименован, внешние ключи таблицы связывания также обновятся; если продукт удален из таблицы «Продукты», любые списки, которые указывают на удаленную запись, также будут удалены. Кроме того, любой новый листинг должен иметь этот внешний ключ, указывающий на действующую существующую запись.

InnoDB является реляционной СУБД (RDBMS) и, следовательно, имеет ссылочную целостность, а MyISAM - нет.

Транзакции и атомарность

Управление данными в таблице осуществляется с помощью операторов языка манипулирования данными (DML), таких как SELECT, INSERT, UPDATE и DELETE. Группа транзакций объединяет два или более операторов DML в одну единицу работы, поэтому применяется либо весь блок, либо ни один из них.

MyISAM не поддерживает транзакции, тогда как InnoDB поддерживает.

Если операция прерывается во время использования таблицы MyISAM, операция немедленно прерывается, и затрагиваемые строки (или даже данные в каждой строке) остаются затронутыми, даже если операция не была завершена.

Если операция прервана во время использования таблицы InnoDB, так как она использует транзакции, которые имеют атомарность, любая транзакция, которая не была завершена, не вступит в силу, так как никакая фиксация не выполняется.

Блокировка стола против блокировки ряда

Когда запрос выполняется к таблице MyISAM, вся таблица, к которой он обращается, будет заблокирована. Это означает, что последующие запросы будут выполняться только после завершения текущего. Если вы читаете большую таблицу и / или часто выполняются операции чтения и записи, это может привести к огромному отставанию в запросах.

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

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

Транзакции и откаты

Когда вы запускаете операцию в MyISAM, изменения устанавливаются; в InnoDB эти изменения можно откатить. Наиболее распространенными командами, используемыми для управления транзакциями, являются COMMIT, ROLLBACK и SAVEPOINT. 1. COMMIT - вы можете написать несколько операций DML, но изменения будут сохранены только после выполнения COMMIT. 2. ROLLBACK - вы можете отменить любые операции, которые еще не были совершены. 3. SAVEPOINT - устанавливает точку в списке операции, на которые операция ROLLBACK может выполнить откат

надежность

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

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

ПОЛНАЯ ТЕКСТОВАЯ индексация

InnoDB не поддерживает индексацию FULLTEXT до версии MySQL 5.6.4. На момент написания этого поста версия MySQL многих провайдеров виртуального хостинга по-прежнему была ниже 5.6.4, что означает, что индексирование FULLTEXT не поддерживается для таблиц InnoDB.

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

Заключение

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

d4nyll
источник
1
Спасибо, действительно содержательное и понятное резюме.
informatik01
18

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

Другие важные различия включают в себя:

  1. InnoDB поддерживает транзакции и внешние ключи. MyISAM нет.
  2. MyISAM использует полнотекстовое индексирование.
  3. MyISAM плохо справляется с обеспечением целостности данных.
bsoist
источник
Устаревший - InnoDB теперь есть FULLTEXTи SPATIAL. InnoDB хорош как для чтения, так и для записи нагрузок.
Рик Джеймс
8

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

  • Строка уровня блокировки
  • Применение внешнего ключа
  • Сопровождение сделки
  • Хит производительности на высокопроизводительных системах
Патрик
источник
5
кроме последней версии MySQL больше не использует MyISAM в качестве движка по умолчанию. В 5.5 они изменили значение по умолчанию на InnoDB :). И я бы не согласился с обобщением, что InnoDB в целом просто получает «удар по производительности». Хорошо спроектированные таблицы InnoDB с надлежащим индексированием и хорошо сконфигурированными настройками памяти могут заставить таблицу InnoDB работать так же, как и ту же схему в MyISAM
TechieGurl
3
Во многих случаях «интенсивного использования» InnoDB на самом деле работает лучше, чем MyISAM. MyISAM - это конкретный инструмент для решения конкретной проблемы, в то время как InnoDB в большинстве случаев будет вам полезнее (поэтому команда MySQL сделала его движком по умолчанию). Именно потому, что MyISAM долгое время был единственным движком, сообщество MySQL приобрело привычку использовать MyISAM по умолчанию, даже после того, как InnoDB повзрослел.
Ник Чаммас
2
Поиск в FULLTEXT для InnoDB был добавлен в процессе разработки MySQL 5.6. Указанный URL-адрес теперь также охватывает InnoDB.
Макс Вебстер
5

MYISAM

MYISAM обеспечивает блокировку на уровне таблицы, поиск FULLTEXT. MYISAM имеет самый гибкий столбец AUTO_INCREMENTED, обрабатывающий все механизмы хранения. MYISAM не поддерживает транзакции.

INNODB

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

Анто
источник
5

Включает изменения MySQL 5.6

ДВИГАТЕЛЬ ХРАНЕНИЯ INNODB:

  • Он обеспечивает полное соответствие требованиям ACID (атомарность, согласованность, изоляция, долговечность). Многовариантность используется для изоляции транзакций друг от друга.
  • InnoDB обеспечивает автоматическое восстановление после сбоя сервера MySQL или хоста, на котором работает сервер.
  • InnoDB поддерживает внешние ключи и ссылочную целостность, включая каскадные удаления и обновления.
  • MySQL 5.6 построен на платформе InnoDB, полностью интегрированной в качестве механизма хранения по умолчанию
  • Постоянная статистика оптимизатора : обеспечивает повышенную точность статистики индекса InnoDB и согласованность при перезапуске MySQL.
  • Сокращение кеша таблиц InnoDB. Чтобы облегчить загрузку памяти в системах с огромным количеством таблиц, InnoDB теперь освобождает память, связанную с открытой таблицей. Алгоритм LRU выбирает таблицы, которые стали самыми длинными без доступа.
  • Поддерживает полнотекстовый поиск: специальный вид индекса, индекс FULLTEXT, помогает InnoDB обрабатывать запросы и операции DML с текстовыми столбцами и содержащимися в них словами. Эти индексы физически представлены как целые таблицы InnoDB.
  • InnoDB, кажется, намного быстрее в полнотекстовом поиске, чем MyISAM

Таким образом, нет смысла использовать MyISAMEngine, если вы уже обновлены до 5.6, если нет, то не ждите обновления до MySQL 5.6.

Производительность InnoDB VS MyISAM с использованием MySQL 5.6

Махеш Патил
источник
2

MyISAM

MyISAM - это механизм хранения для MySQL. До MySQL 5.5 это был механизм хранения по умолчанию для MySQL. Он основан на более старом механизме хранения ISAM. MyISAM оптимизирован для сред с интенсивными операциями чтения и небольшим количеством операций записи или вообще без записи. Причина, по которой MyISAM допускает быстрое чтение, заключается в структуре его индексов: каждая запись указывает на запись в файле данных, а указатель смещается относительно начала файла. Таким образом, записи могут быть быстро прочитаны, особенно когда формат ИСПРАВЛЕН. Таким образом, строки имеют постоянную длину. Типичной областью, в которой можно предпочесть MyISAM, является хранилище данных, поскольку оно включает запросы к очень большим таблицам, и обновление таких таблиц выполняется, когда база данных не используется (обычно ночью). Вставки тоже просты, потому что новые строки добавляются в конец файла данных. Тем не мение, операции удаления и обновления более проблематичны: при удалении должно оставаться пустое место, иначе смещение строк будет меняться; то же самое касается обновлений, так как длина строк становится короче; если обновление делает строку длиннее, строка фрагментируется. Чтобы дефрагментировать строки и требовать пустое пространство,OPTIMIZE TABLEКоманда должна быть выполнена. Из-за этого простого механизма статистика индекса MyISAM обычно достаточно точна. Другими серьезными недостатками MyISAM являются отсутствие поддержки транзакций и внешних ключей.

InnoDB

InnoDB - это механизм хранения для MySQL. MySQL 5.5 и более поздние версии используют его по умолчанию. Он обеспечивает стандартные ACID-совместимые функции транзакций, а также поддержку внешнего ключа (декларативная ссылочная целостность). Он реализует как транзакции SQL, так и XA, табличные пространства, FULLTEXTиндексы и пространственные операции в соответствии со стандартом OpenGIS. Он входит в стандартную комплектацию большинства двоичных файлов, распространяемых MySQL AB, за исключением некоторых версий OEM. Программное обеспечение имеет двойную лицензию корпорации Oracle; он распространяется по Стандартной общественной лицензии GNU, но также может быть лицензирован сторонам, желающим объединить InnoDB в проприетарном программном обеспечении.

вилки

MariaDB имеет механизм хранения под названием Aria, который описывается как «безопасная альтернатива MyISAM». MariaDB и Percona Server по умолчанию используют форк InnoDB, называемый XtraDB. XtraDB поддерживается Percona. Изменения Oracle InnoDB регулярно импортируются в XtraDB, а также добавляются некоторые исправления ошибок и дополнительные функции.

wogsland
источник