Каковы основные различия между InnoDB и MyISAM?
Каковы основные различия между InnoDB и MyISAM?
Ответы:
Первое существенное отличие, которое я вижу, заключается в том, что InnoDB реализует блокировку на уровне строк, в то время как MyISAM может выполнять только блокировку на уровне таблиц. Вы найдете лучшее восстановление после сбоев в InnoDB. Тем не менее, он не имеет FULLTEXT
поисковых индексов до v5.6, как и MyISAM. InnoDB также реализует транзакции, внешние ключи и ограничения отношений, в то время как MyISAM этого не делает.
Список может пойти немного дальше. Тем не менее, они оба имеют свои уникальные преимущества в их пользу и недостатки друг против друга. Каждый из них более подходит в некоторых сценариях, чем другой.
Итак, подведем итог ( TL; DR ):
FULLTEXT
поисковые индексы, InnoDB не было до MySQL 5.6 (февраль 2013).version 5.6.4
InnoDB поддерживает FULLTEXT
поиск. dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html
Еще одно важное отличие, которое еще не упоминалось, заключается в том, как осуществляется кэширование для каждого механизма хранения.
Основной используемый механизм - это кеш ключей. Он кэширует только индексные страницы из файлов .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, выполните следующий запрос:
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). Для простоты, учитывая только два файла журнала, вот как вы можете их размер:
service mysql stop
rm /var/log/mysql/ib_logfile[01]
service mysql start
(ib_logfile0 и ib_logfile1 воссоздаются)В конце обоих запросов есть встроенный запрос
(SELECT 2 PowerOf1024)
B
(SELECT 0 PowerOf1024)
дает настройку в байтах(SELECT 1 PowerOf1024)
дает настройку в килобайтах(SELECT 2 PowerOf1024)
дает настройку в мегабайтах(SELECT 3 PowerOf1024)
дает настройку в гигабайтахТам нет замены для здравого смысла. Если у вас ограниченная память, комбинация механизмов хранения или их комбинация, вам придется настраиваться на разные сценарии.
Возможные сценарии бесконечны !!!
Помните, что на что бы вы ни выделяли, оставьте достаточно оперативной памяти для подключений к БД и операционной системы.
InnoDB предлагает:
В 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
не используется)MyISAM имеет блокировку на уровне таблицы, но не блокировку на уровне строки. Нет транзакций. Нет автоматического восстановления после сбоя, но он предлагает функциональность таблицы восстановления. Нет ограничений по внешнему ключу. Таблицы MyISAM обычно более компактны по размеру на диске по сравнению с таблицами InnoDB. Таблицы MyISAM могут быть значительно уменьшены в размерах путем сжатия с помощью myisampack, если это необходимо, но становятся доступными только для чтения. MyISAM хранит индексы в одном файле и данные в другом. MyISAM использует ключевые буферы для кэширования индексов и оставляет управление кэшированием данных операционной системе.
В целом, я бы порекомендовал InnoDB для большинства целей и MyISAM только для специализированных целей. InnoDB - теперь движок по умолчанию в новых версиях MySQL.
Еще одна вещь: вы можете сделать резервную копию таблиц InnoDB, просто сделав снимок файловой системы. Резервное копирование MyISAM требует использования mysqldump и не обязательно будет согласованным (например, если вы вставляете в родительскую и дочернюю таблицу, вы можете найти только строку дочерней таблицы в вашей резервной копии).
По сути, если у вас есть другая копия данных и вы кешируете ее только в MySQL, например, чтобы разрешить стандартные средства доступа к ней с веб-сайта PHP, то с MyISAM все в порядке (т. Е. Это лучше, чем простой CSV-файл или файл журнала для запросов и одновременный доступ). Если база данных является реальной «главной копией» данных, если вы делаете INSERT
и UPDATE
используете реальные данные от пользователей, то глупо использовать что-либо, кроме InnoDB, в любом масштабе MyISAM ненадежен и сложен в управлении, вы буду делать myisamchk
половину времени, сводя на нет все приросты производительности ...
(Мой личный опыт: 2-терабайтная БД в MyISAM).
Немного опоздал к игре ... но вот довольно обширный пост, который я написал несколько месяцев назад и подробно описывающий основные различия между 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 или другие типы данных, когда они удовлетворяют конкретной потребности.
По моему опыту, наиболее существенным отличием является способ блокировки каждого двигателя. InnoDB использует блокировку строк, в то время как MyISAM использует блокировку таблиц. Как правило, я использую InnoDB для записи тяжелых таблиц и MyISAM для чтения тяжелых таблиц.
Другие важные различия включают в себя:
FULLTEXT
и SPATIAL
. InnoDB хорош как для чтения, так и для записи нагрузок.
Я склонен рассматривать MyISAM в качестве таблицы по умолчанию для MySQL, поэтому я укажу на различия для большинства пользователей InnoDB
MYISAM
MYISAM обеспечивает блокировку на уровне таблицы, поиск FULLTEXT. MYISAM имеет самый гибкий столбец AUTO_INCREMENTED, обрабатывающий все механизмы хранения. MYISAM не поддерживает транзакции.
INNODB
INNODB - это механизм безопасного хранения транзакций. INNODB обладает возможностями фиксации, отката и восстановления после сбоев. INNODB поддерживает ссылочную целостность внешнего ключа.
Включает изменения MySQL 5.6
ДВИГАТЕЛЬ ХРАНЕНИЯ INNODB:
Таким образом, нет смысла использовать MyISAM
Engine, если вы уже обновлены до 5.6, если нет, то не ждите обновления до MySQL 5.6.
Производительность InnoDB VS MyISAM с использованием MySQL 5.6
MyISAM - это механизм хранения для MySQL. До MySQL 5.5 это был механизм хранения по умолчанию для MySQL. Он основан на более старом механизме хранения ISAM. MyISAM оптимизирован для сред с интенсивными операциями чтения и небольшим количеством операций записи или вообще без записи. Причина, по которой MyISAM допускает быстрое чтение, заключается в структуре его индексов: каждая запись указывает на запись в файле данных, а указатель смещается относительно начала файла. Таким образом, записи могут быть быстро прочитаны, особенно когда формат ИСПРАВЛЕН. Таким образом, строки имеют постоянную длину. Типичной областью, в которой можно предпочесть MyISAM, является хранилище данных, поскольку оно включает запросы к очень большим таблицам, и обновление таких таблиц выполняется, когда база данных не используется (обычно ночью). Вставки тоже просты, потому что новые строки добавляются в конец файла данных. Тем не мение, операции удаления и обновления более проблематичны: при удалении должно оставаться пустое место, иначе смещение строк будет меняться; то же самое касается обновлений, так как длина строк становится короче; если обновление делает строку длиннее, строка фрагментируется. Чтобы дефрагментировать строки и требовать пустое пространство,OPTIMIZE TABLE
Команда должна быть выполнена. Из-за этого простого механизма статистика индекса MyISAM обычно достаточно точна. Другими серьезными недостатками MyISAM являются отсутствие поддержки транзакций и внешних ключей.
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, а также добавляются некоторые исправления ошибок и дополнительные функции.