Когда речь заходит о MySQL, то сложно понять MyISAM и InnoDB, которые являются двумя из самых известных и широко используемых движков хранения на MySQL. Сегодня я расскажу вам о разнице между MyISAM и InnoDB в MySQL...
Что такое MyISAM?
MyISAM является движком хранения по умолчанию для системы управления реляционными базами данных MySQL (до версии 5.5)。 Эта структура хранения таблиц MySQL расширяет многие полезные функции из старого кода ISAM. В новой версии MySQL движок InnoDB в значительной степени вытесняет MyISAM благодаря своим преимуществам в плане транзакций, целостности референтов и большей параллельности. Каждая таблица MyISAM соответствует трём файлам на жёстком диске. Все три файла имеют одинаковое имя, но имеют разные расширения, указывающие на их типовое назначение: .frm-файл содержит определение таблицы, но этот файл не является частью движка MyISAM, а является частью сервера; .MYD хранит данные таблицы; .MYI — индексный файл таблицы.
Что такое InnoDB?
InnoDB — ещё один движок хранения для MySQL, и новая версия стандарта, выпущенная MySQL AB, включена во все бинарные установочные пакеты.с 5.5 и далее как движок хранения по умолчанию。 Его преимущества перед другими движками хранения — поддержка совместимых с ACID транзакций (аналогично PostgreSQL) и целостность параметров (то есть поддержка внешних ключей).
Корпорация Oracle приобрела Innobase в октябре 2005 года. Innobase использует авторизацию двойной аутентификации. Он распространяется с помощью GNU и также позволяет другим группам, желающим интегрировать InnoDB в коммерческое программное обеспечение, получить лицензию.
Самые популярные движки хранения — MyISAM и InnoDB. Основные отличия между MyISAM и InnoDB — это производительность и контроль транзакций. MyISAM — это расширенная реализация раннего ISAM (Indexed Sequential Access Method, ISAM больше не поддерживается после MySQL 5.0), ISAM разработан для обработки ситуаций, когда частота чтения значительно выше частоты записи, поэтому ISAM и позднее MyISAM не учитывают поддержку таких компонентов, исключают TPM, не нуждаются в записях транзакций, эффективность запросов ISAM высока, а потребление памяти очень мало. MyISAM наследует эти преимущества, одновременно идя в ногу с множеством полезных новых функций и связанных инструментов. Например, учитывая контроль параллелизма, предусмотрены блокировки на уровне таблиц, и хотя сам MyISAM не поддерживает отказоустойчивость, его можно использовать для восстановления после сбоев с помощью myisamchk. Поскольку MyISAM использует собственные независимые файлы хранения (файл данных MYD и индекс индекса MYI) для каждой таблицы, резервное копирование и восстановление очень удобно (достаточно перезаписать копию), а также поддерживает онлайн-восстановление. По сравнению с другими движками хранения, MyISAM предлагает большинство инструментов для проверки и ремонта таблиц. Таблицы MyISAM можно сжимать и поддерживают полнотекстовый поиск. Они не безопасны для транзакций и не поддерживают внешние ключи, поэтому если ваше приложение не требует транзакций и обрабатывает только базовые операции CRUD, то MyISAM — лучший выбор. InnoDB разработан для условий чтения и записи с высокой параллелностью, используя MVCC (Multi-Version Concurrency Control) и блокировки на уровне строк для обеспечения поддержки транзакций, соответствующих ACID. InnoDB поддерживает целостность внешних ключей и обладает возможностями восстановления после отказа. Кроме того, производительность InnoDB на самом деле довольно высокая, особенно при обработке больших объёмов данных, если говорить официально: эффективность процессора InnoDB несравнима с другими дисковыми реляционными движками хранения баз данных. Однако резервное копирование и восстановление в InnoDB немного сложнее, если только вы не используете поддержку Mulit-tablespace, предоставляемую в версии 4.1 или выше, потому что, в отличие от MyISAM, файлы данных InnoDB не соответствуют каждой таблице отдельно. Вместо этого используется общее пространство таблицы, и простой метод перезаписи копирования ему не подходит, поэтому данные должны быть восстановлены после остановки MYSQL. Использование tablespacesd для каждой таблицы соответствует отдельному файлу tablespace, ситуация гораздо проще. Он обладает теми же характеристиками, что и BDB-типы, а также поддерживает внешние ключи. Таблицы InnoDB быстрые и обладают более богатыми функциями, чем BDB, поэтому рекомендуется использовать их для транзакционно защищённого движка хранения.
В целом, InnoDB — хороший выбор, если требуется поддержка транзакций, и имеет высокую частоту одновременного чтения и записи. BDB можно рассматривать, если частота одновременных чтений и записи невысока, но BDB больше не будет поддерживаться в версиях MySQL 5.1 и позднее. Этот вариант исчез
По умолчанию транзакции InnoDB открыты (установлен autocommit = 0), что означает, что каждый раз при вставке записи таблица InnoDB рассматривает её как отдельную транзакцию. Если мы вставим 10 000 записей и не закроем транзакцию, то таблица типа InnoDB будет считать это 10 000 транзакций, и общее время вставки на данный момент значительное. В этот момент нужно сначала отключить транзакцию, а затем вставить её, так что скорость будет очень высокой. Что касается Heap и BDB (Berkeley DB), относительно говоря, уровень проникновения ниже, чем в предыдущих двух, но в некоторых случаях, Движок хранения кучи по-прежнему очень удобен, он хранит данные в памяти и работает очень быстро, потому что нет ожидающего дискового ввода-вывода. Но поскольку это движок памяти, любые изменения исчезнут после перезапуска сервера. Heap — отличное место для тестирования BDB, так как это первый транзакционно защищённый движок хранения в MySQL. Построенный на базе данных Berkeley DB, он также является транзакционно безопасным, но BDB, очевидно, не так популярен, как InnoDB, поскольку большинство движков хранения в MySQL, поддерживающих транзакции, также ищут MVCC или движки блокировки на уровне строк, тогда как BDB поддерживает только блокировку на уровне страницы.
Движок InnoDB
InnoDB — это транзакционный движок хранения, поддерживающий откат и предназначенный для предоставления высокопроизводительных сервисов при обработке больших объёмов данных, а также создаёт буферные пулы в памяти во время выполнения для буферизации данных и индексов.
Преимущества движка InnoDB:
1. Поддержка обработки транзакций и функций транзакций ACID;
2. Реализованы четыре уровня изоляции стандарта SQL;
3. Поддержка ограничений на блокировку на уровне строки и внешних ключей;
4. Вы можете использовать журналы транзакций для восстановления данных.
5. Уровень блокировки — это рядный замок, что подходит для частых изменений таблиц с высокой параллелью, а высокая параллельность лучше, чем MyISAM. Недостаток в том, что потребление системы значительное.
6. Индекс кэширует не только сам, но и кэширует данные, что требует больше памяти, чем MyISAM.
Недостатки движка InnoDB:
Поскольку она не сохраняет количество строк в таблице, вся таблица сканируется при использовании статистики COUNT.
Движок MyISAM
MyISAM был движком по умолчанию до MySQL 5.5.5 и разработан для быстрого чтения.
Преимущества движка MyISAM:
1. Высокоэффективное чтение;
2. Поскольку это сохраняет количество строк в таблице, вся таблица не будет сканироваться при использовании статистики COUNT;
Недостатки движка MyISAM:
1. Уровень замка — это настольный замок, и преимущество часового замка в том, что верхний блок небольшой и быстрый; Недостатки заключаются в том, что гранулярность замка высокая, вероятность импульса блокировки высока, а также низкая параллельная пропускная способность, что подходит для сервисов на основе запросов.
2. Этот движок не поддерживает транзакции или внешние ключи.
3. Операции INSERT и UPDATE должны блокировать всю таблицу;
4. Он хранит количество строк в таблице, поэтому при выборе COUNT(*) из таблицы нужно только напрямую читать сохраненные значения без сканирования всей таблицы.
Применимые сценарии
MyISAM подходит для: (1) выполнения большого количества вычислений счёта; (2) Редкое вставление и очень частые запросы; (3) Бизнеса нет.
InnoDB подходит для: (1) высоких требований к надёжности или транзакций; (2) Обновления таблиц и запросы происходят довольно часто, а вероятность блокировки таблиц относительно высока.
Сравнение таблиц
| Свойства | MyISAM | Куча | BDB | InnoDB | | Транзакции | Не поддерживается | Не поддерживается | Поддерживать кого-либо | Поддерживать кого-либо | | Гранулярность замка | Замок на столе | Замок на столе | Блокировка страницы (страница, 8 КБ) | Шлюз | | хранение | Разделённые файлы | В памяти | Один файл на каждую таблицу | Табличное пространство | | Уровень изоляции | не | не | Read Committed | Все | | Портативный формат | быть | Н/Д | не | быть | | Полнота цитирования | не | не | не | быть | | Первичный ключ данных | не | не | быть | быть | | MySQL кэширует записи данных | не | Да | Да | Да | | юзабилити | Полная версия | Полная версия | MySQL-Max | Полная версия |
Некоторые различия в деталях
1. InnoDB не поддерживает индексы типа FULLTEXT, которые поддерживаются с MySQL 5.6 (экспериментальное).
2. InnoDB не сохраняет конкретное количество строк таблицы, то есть при выполнении select count() из таблицы InnoDB должен сканировать всю таблицу, чтобы вычислить количество строк, а MyISAM достаточно просто прочитать количество сохранённых строк. Обратите внимание, что когда оператор count() содержит условие where , операция одинакова для обеих таблиц.
3. Для полей AUTO_INCREMENT типа InnoDB должен содержать индекс только с этим полем, но в таблице MyISAM можно создать совместный индекс с другими полями.
4. При DELETE FROM таблицы InnoDB не создаёт таблицу заново, а удаляет её строка за строкой.
5. Операция LOAD TABLE FROM MASTER не работает для InnoDB, решение состоит в том, чтобы сначала изменить таблицу InnoDB на таблицу MyISAM, затем импортировать данные, а затем сделать их в таблицу InnoDB, но она не применима к таблице, использующей дополнительные функции InnoDB (например, внешние ключи).
6. Кроме того, блокировка строк таблицы InnoDB не является абсолютной: если MySQL не может определить диапазон для сканирования при выполнении SQL-оператора, таблица InnoDB также заблокирует всю таблицу.
7. InnoDB не поддерживает полнотекстовое индексирование, тогда как MyISAM поддерживает. Индексация полного текста означает создание индекса обратного порядка каждого слова в виде char, varchar и текста (за исключением стоп-слов). Полнотекстовый индекс MyISAM на самом деле бесполезен, так как не поддерживает сегментацию китайских слов и должен записываться в таблицу данных пользователем после сегментации, а слова с менее чем 4 китайскими иероглифами игнорируются, как стоп-слова.
|