Каковы текущие различия между механизмами хранения MyISAM и InnoDB, особенно в MySQL 5.7?

Я видел так много вопросов и ответов на эту тему MyISAM против InnoDB на самом стеке потока.

Но все вопросы и ответы слишком старые и не имеют отношения к текущей стабильной версии MySQL 5.7.x

К тому времени, как MyISAM, так и InnoDB должны были сделать так много разработок.

Итак, мне нужны эти различия, доступные в настоящее время с версией 5.7.x

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

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

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

Если да, то как будут выполняться запросы JOIN между таблицами с MyISAM и InnoDB?

Правда ли, что MySQL собирается удалить механизм хранения MyISAM из будущей версии?

2 ответа

Решение

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

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

Но вы можете заметить, что в руководстве по MySQL 5.7 раздел MyISAM понижен до Альтернативных систем хранения, что должно указывать на то, что он получает меньший приоритет.

В MySQL 5.7 MyISAM все еще используется для некоторых системных таблиц, таких как mysql.user, mysql.db и т. д. Но новые системные таблицы, введенные в 5.6 и 5.7, - это InnoDB. Все системные таблицы InnoDB в MySQL 8.0.

MyISAM по-прежнему не поддерживает какие-либо свойства ACID. Здесь нет транзакций, функций согласованности и длительных записей. Смотрите мой ответ на MyISAM против InnoDB.

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

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

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

Оба логических инструмента резервного копирования, такие как mysqldump и физические инструменты резервного копирования, такие как Percona XtraBackup, не могут создавать резервные копии таблиц MyISAM без получения глобальной блокировки.

Вы спросили, можете ли вы создать различные таблицы с разными механизмами хранения в одной и той же схеме. Да, вы можете, и это то же самое, что было для многих версий MySQL.

Вы спросили, можете ли вы объединять таблицы разных механизмов хранения (кстати, таблицы не обязательно должны быть в одной схеме). Да, вы можете присоединиться к таким таблицам, MySQL позаботится обо всех деталях. Это то же самое, что и для многих версий MySQL.

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

Случаи, когда MyISAM имеет преимущество перед InnoDB, это короткий список, и он становится короче.

  • Некоторые запросы на сканирование таблиц и массовые вставки выполняются быстрее в MyISAM. InnoDB лучше при индексированных поисках.

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

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

  • SELECT COUNT(*) FROM MyTable Запросы (без предложения WHERE) выполняются в MyISAM очень быстро, поскольку точное количество строк сохраняется в метаданных MyISAM. InnoDB (или другие реализации MVCC) не сохраняют этот счет постоянным, потому что каждая транзакция, просматривающая таблицу, может "видеть" различное количество строк. Только механизм хранения с блокировкой на уровне таблицы и без изоляции транзакций, такой как MyISAM, может оптимизировать этот случай.

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

    CREATE TABLE MyTable (
      group_id INT NOT NULL,
      seq_id INT NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (group_id, seq_id)
    ) ENGINE=MyISAM;
    
  • Переместить таблицу MyISAM с сервера на сервер по-прежнему легко, поскольку файлы.MYD и.MYI являются автономными. Вы можете сделать что-то похожее с таблицами InnoDB, но вы должны использовать сложную функцию переносимых табличных пространств. Но это легкое в переносе качество таблиц MyISAM больше не работает в MySQL 8.0 из-за их новой функции словаря данных.

  • При определенной нагрузке MyISAM может быть лучшим выбором для internal_tmp_disk_storage_engine, который по умолчанию InnoDB в MySQL 5.7. Если вы выполняете много запросов, которые создают временные таблицы на диске (временные таблицы в памяти не принесут пользы), это может создать нагрузку на движок InnoDB. Но вам нужно иметь высокую частоту запросов, чтобы это имело значение, и если ваши запросы создают так много временных таблиц на диске, вы должны попытаться оптимизировать запросы по-разному.

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

Рекомендации:

https://www.percona.com/blog/2016/10/11/mysql-8-0-end-myisam/

https://www.percona.com/blog/2017/12/04/internal-temporary-tables-mysql-5-7/

http://jfg-mysql.blogspot.com/2017/08/why-we-still-need-myisam.html

У меня был этот вопрос для викторины работы и понял его правильно: (ссылаясь на новую версию):

MyISAM и InnoDB - это два разных механизма хранения, которые по-разному обрабатывают операции CRUD.

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

  • Транзакции: InnoDB поддерживает транзакции, в отличие от MyISAM. Транзакции представляют собой набор из 2 или более команд, таких как SELECT, INSERT, UPDATE и DELETE, в одну операцию до завершения.

    1. Атомарные операции: при установке транзакции в InnoDB операция не завершена - она ​​завершает все изменения и восстанавливает БД в том виде, в каком она была (все или ничего), например, если в середине транзакции присутствует синтаксис ошибка в несоответствии кода / типа данных или чего-либо, что могло бы прервать пакет команд для завершения его работы - все изменения не будут применены, благодаря транзакциям atomicy. С другой стороны, при использовании механизма хранения MyISAM, если пакет команд "ломается" (по любой причине), операция немедленно останавливается и все затронутые таблицы / строки / данные остаются затронутыми, что может привести к повреждению данные в базе данных (... и головная боль).

    2. Б. Выполнение операции на MyISAM устанавливается на месте, тогда как InnoDB позволяет вам использовать "ROLLBACK" для отмены любых изменений, что лучше всего подходит при выполнении транзакций.

    3. Журналы транзакций: при создании транзакции без промежуточного журнала транзакций вы можете применить любые изменения к таблицам / таблицам в БД, и если таблица имеет кластерный индекс (например), данные должны будут искать, где именно она должен быть вставлен и только тогда применить изменения. В случае, когда между БД и транзакцией существует журнал транзакций, изменения будут сначала отправлены в журнал транзакций и установят свой порядок в таблице перед отправкой изменения в БД, что займет меньше времени. БД сохраняет журналы всех выполненных транзакций, что может помочь выбрать восстановление любой ранее сделанной транзакции и восстановить все изменения. При установке "простой" модели восстановления транзакции удаляются из журнала транзакций и не могут восстановить данные (обычно используемые в средах DEV). При установке модели полного восстановления все транзакции сохраняются и отображаются в списке, готовые к восстановлению - это обычно используется в производственных средах, которые могут вызывать проблемы, такие как проблемы с предварительным выполнением, - поэтому их резервное копирование и удаление с сервера могут стать решением. При использовании модели восстановления с "массовой регистрацией" журналы транзакций сохраняются только для определенных "важных" изменений и команд (импорт, экспорт, вставка-выбор, выбор, реорганизация / перестройка индексов) и могут предотвратить проблемы с предварительным выполнением.

  • Внешние ключи: MyISAM не использует внешние ключи, в отличие от InnoDB. Когда для столбца таблицы задан ключ foregin, указывающий на другой столбец таблицы, когда происходит обновление / удаление в указанной таблице, он будет знать, что изменения должны быть применены к другой таблице, указывающей на него. Это создает некую связь между двумя таблицами и синхронизирует данные. Настройка таблиц с FK может потребовать больше усилий, что может рассматриваться как недостаток (?).

  • Индексация FULLTEXT: InnoDB не поддерживает индексацию FULLTEXT в своих предыдущих версиях - MyISAM поддерживает ее. Переключение на MyISAM не будет лучшим решением, поэтому просто обновите MySQL до версии, которая поддерживает индексацию FULLTEXT. Индексирование FULLTEXT может принимать тексты, такие как заголовки, комментарии и т. Д., - и искать их (в этом случае это должен быть лучший вариант, чем команда "LIKE").

  • Пространственные типы данных: поддерживаются только в InnoDB.

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

Другие вопросы по тегам