В чем разница между InnoDB и MyISAM?


17

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


Не стесняйтесь также добавлять тег MySQL :)
Johan

Разве это не относится к stackoverflow?
ripper234

@ ripper234. В SO есть две лучшие версии этого поста (гораздо больше предыстории; больше демонстрации предыдущих исследований): stackoverflow.com/q/12614541/209139 и stackoverflow.com/q/20148/209139 .
TRiG

Ответы:


14

ISAM = метод индексированного последовательного доступа и, по сути, простой файл (для тех администраторов баз данных, которые могут помнить, думать Btrieve или B-Tree). Это очень старая технология - но не позволяйте этому откладывать ее использование. Поскольку это плоский файл (подробнее об этом позже), он не является реляционным, и, следовательно, не является СУБД и, следовательно, более подходит в некоторых ситуациях.

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

ISAM великолепен, если у вас много записей (например, 20 миллионов), и записи в основном автономны (то есть вам не нужно делать много ссылок для извлечения связанных данных). Он ОЧЕНЬ сильно зависит от индексов, и если у вас нет нужного индекса, будьте готовы к очень и очень длительному времени запросов. Пример: у нас была таблица Btrieve ISAM с 20M + записями, и поиск и фильтрация данных на основе точного индекса были практически мгновенными. Использование неправильного индекса было буквально 15 минут.

InnoDB отлично подходит, если у вас много реляционных ссылок. Таблица A ссылается на поле в таблице B, которое ссылается на таблицы C и D. InnoDB может извлекать эти записи, используя всевозможные удобные методы соединения (хэш-соединения и т. Д.), Тогда как в базе данных ISAM для каждого отдельного запроса придется выполнять несколько подзапросов. грести и сопоставлять записи вручную.

Вам действительно придется пройти курс по базам данных, если вы хотите гораздо больше деталей, чем это!


ISAM такой же реляционный, как и все остальное, просто он не оптимизирован для этого.
LapTop006

спасибо 4 ваше краткое описание. Теперь в основном я очищен

5

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


2

В наши дни, если вы не используете таблицу для данных стиля журнала (гораздо больше INSERT, чем SELECT, транзакций нет) InnoDB обычно быстрее, надежнее, имеет больше функций и т. Д.

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

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


2

Немного опоздал к игре ... но вот довольно обширный пост, который я написал несколько месяцев назад и подробно описывающий основные различия между 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 или другие типы данных, когда они удовлетворяют конкретной потребности.


1

Как правило, если вам нужна скорость, используйте MyISAM, а если вам нужна стабильность, используйте InnoDB. Что-то связанное с атомарностью, если я правильно помню.


3
За исключением того, что это уже не так, InnoDB на самом деле быстрее в большинстве случаев.
LapTop006

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