Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

InnoDB - это реляционная СУБД (СУБД), поэтому она имеет ссылочную целостность, а 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 автоматически восстановится через воспроизведение этих журналов.

FULLTEXT индексирование

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

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

Вывод

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

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