Каковы основные различия между InnoDB и MyISAM?

В чем основные отличия между InnoDB и MyISAM?

201 голос | спросил ilhan 3 Jpm1000000pmMon, 03 Jan 2011 23:46:02 +030011 2011, 23:46:02

10 ответов


129

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

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

Итак, суммируем ( TL; DR ):

  • InnoDB имеет блокировку на уровне строк, MyISAM может выполнять только блокировку на уровне таблицы.
  • У InnoDB есть лучшее восстановление после сбоя.
  • В MyISAM есть индексы поиска FULLTEXT, InnoDB не добрался до MySQL 5.6 (февраль 2013 г.).
  • InnoDB реализует транзакции, внешние ключи и ограничения отношений, MyISAM этого не делает.
ответил poelinca 4 Jam1000000amTue, 04 Jan 2011 00:04:21 +030011 2011, 00:04:21
73

Еще одно существенное отличие, о котором еще не упоминалось, заключается в том, как делается кэширование для каждого механизма хранения.

MYISAM

Основным используемым механизмом является кеш ключей. Он только кэширует индексные страницы из файлов .MYI. Чтобы определить размер кеша ключа, запустите следующий запрос:

SELECT CONCAT (ROUND (KBS /POWER (1024,
ЕСЛИ (PowerOf1024 & л; 0,0, ЕСЛИ (PowerOf1024 > 3,0, PowerOf1024))) + 0,4999),
SUBSTR ('KMG', IF (PowerOf1024 <0,0,
ЕСЛИ (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_buffer_size ), учитывая ваш текущий набор данных ( запрос ограничит рекомендацию на 4G (4096M). Для 32-разрядной ОС ограничение на 4 ГБ. Для 64-битного, 8 ГБ.

InnoDB

Основным используемым механизмом является буферный пул InnoDB. Он кэширует данные и индексирует страницы из доступных таблиц InnoDB. Чтобы настроить буферный пул InnoDB, выполните следующий запрос:

SELECT CONCAT (ROUND (KBS /POWER (1024,
ЕСЛИ (PowerOf1024 & л; 0,0, ЕСЛИ (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 (4096 М). Для простоты, учитывая только два файла журнала, вот как вы можете их размер:

  • Шаг 1) Добавьте innodb_log_file_size = NNN в /etc/my.cnf (NNN должен быть 25% от innodb_buffer_pool_size или 2047M, в зависимости от того, что меньше)
  • Шаг 2) служба mysql stop
  • Шаг 3) rm /var /log /mysql /ib_logfile [01]
  • Шаг 4) service mysql start (обновлены ib_logfile0 и ib_logfile1)

CAVEAT

В конце обоих запросов есть встроенный запрос (SELECT 2 PowerOf1024) B

  • (SELECT 0 PowerOf1024) предоставляет настройки в байтах
  • (SELECT 1 PowerOf1024) задает настройку в килобятах
  • (SELECT 2 PowerOf1024) задает настройку в мегабайтах
  • (SELECT 3 PowerOf1024) задает настройку в гигабайтах
  • Без полномочий меньше 0 или более 3.

Эпилог

Нет здравого смысла. Если у вас ограниченная память, смесь механизмов хранения или их комбинация, вам придется корректировать различные сценарии.

  • Если у вас 2GB RAM и 16GB InnoDB, выделите 512M как innodb_buffer_pool.
  • Если у вас 2 ГБ оперативной памяти и 4 ГБ индексов MyISAM, выделите 512M как key_buffer_size.
  • Если у вас 2 ГБ оперативной памяти и 4 ГБ индексов MyISAM и 16 ГБ InnoDB, выделите 512M как key_buffer_size и 512M как innodb_buffer_pool_size.

Возможные сценарии бесконечны !!!

Помните, что бы вы ни выделили, оставьте достаточное количество ОЗУ для соединений DB и операционной системы.

ответил RolandoMySQLDBA 15 AMpFri, 15 Apr 2011 01:03:31 +040003Friday 2011, 01:03:31
51

InnoDB предлагает:

  • Операции ACID
  • блокировка на уровне строк
  • ограничения внешних ключей
  • автоматическое восстановление после сбоя
  • сжатие таблицы (чтение /запись)
  • Типы пространственных данных (без пространственных индексов)

В InnoDB все данные в строке, кроме TEXT и BLOB, могут занимать не более 8 000 байт. Индексация полного текста недоступна в InnoDB до MySQL 5.6 (февраль 2013 г.). В InnoDB COUNT (*) s (если WHERE, GROUP BY или JOIN) не используется) выполните медленнее, чем в MyISAM, потому что количество строк не сохраняется внутри. InnoDB хранит данные и индексы в одном файле. InnoDB использует буферный пул для кэширования как данных, так и индексов.

MyISAM предлагает:

  • fast COUNT (*) s (если WHERE, GROUP BY или JOIN) не используется)
  • полнотекстовое индексирование (обновление: поддерживается в InnoDB из MySQL 5.6)
  • меньший размер диска
  • очень высокое сжатие таблицы (только для чтения)
  • Типы пространственных данных и индексы (R-tree) (обновление: поддерживается в InnoDB из MySQL 5.7)

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

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

ответил dabest1 13 J000000Wednesday11 2011, 03:38:50
27

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

В принципе, если у вас есть другая копия данных и они кэшируются только в MySQL, например. чтобы позволить стандартное средство доступа к нему с веб-сайта PHP, тогда MyISAM в порядке (то есть он лучше, чем плоский CSV-файл или файл журнала для запросов и одновременного доступа). Если база данных является фактической «основной копией» данных, если вы выполняете INSERT и UPDATE, используя реальные данные от пользователей, то глупо использовать что-либо другое, кроме InnoDB, в любом типе масштаба MyISAM ненадежна и сложна в управлении, вы будете выполнять myisamchk половину времени, отрицая при этом выигрыш в производительности ...

(Мой личный опыт: 2 терабайт DB в MyISAM).

ответил Gaius 4 Jam1000000amTue, 04 Jan 2011 00:29:30 +030011 2011, 00:29:30
19

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


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

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

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

InnoDB - реляционная СУБД (RDBMS) и, следовательно, имеет ссылочную целостность, в то время как MyISAM этого не делает.

Транзакции & Атомарность

Данные в таблице управляются с помощью операторов языка манипулирования данными (DML), таких как SELECT, INSERT, UPDATE и DELETE. Группа транзакций состоит из двух или более операторов DML вместе в одну единицу работы, поэтому применяется либо весь блок, либо ни один из них.

MyISAM не поддерживает транзакции, в то время как InnoDB делает.

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

Если операция прервана при использовании таблицы InnoDB, поскольку она использует транзакции, которые имеют атомарность, любая транзакция, которая не переходит к завершению, не вступает в силу, поскольку фиксация не выполняется.

Столбиковая блокировка против блокировки строк

Когда запрос выполняется против таблицы MyISAM, вся таблица, в которой выполняется запрос, будет заблокирована. Это означает, что последующие запросы будут выполняться только после завершения текущего. Если вы читаете большую таблицу и /или часто выполняете операции чтения и записи, это может означать огромное отставание запросов.

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

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

Транзакции & Rollbacks

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

ответил d4nyll 21 Jpm1000000pmWed, 21 Jan 2015 18:34:21 +030015 2015, 18:34:21
16

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

Другие важные отличия:

  1. Поддержка InnoDB и внешние ключи. MyISAM не делает.
  2. MyISAM использует полнотекстовую индексацию.
  3. MyISAM выполняет плохую работу по обеспечению целостности данных.
ответил bsoist 4 Jam1000000amTue, 04 Jan 2011 00:05:13 +030011 2011, 00:05:13
7

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

  • Блокировка уровня строки
  • Внедрение внешнего ключа
  • Поддержка транзакций
  • Производительность на высокопроизводительных системах
ответил Patrick 4 Jam1000000amTue, 04 Jan 2011 00:06:55 +030011 2011, 00:06:55
4

MYISAM

MYISAM обеспечивает блокировку уровня таблицы, поиск FULLTEXT. MYISAM имеет самую гибкую обработку столбцов AUTO_INCREMENTED для всех механизмов хранения. MYISAM не поддерживает транзакции.

INNODB

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

ответил Anto 10 AM000000100000003231 2012, 10:15:32
4

Включает изменения MySQL 5.6

ДВИГАТЕЛЬ ХРАНЕНИЯ INNODB:

  • Он обеспечивает полную ACID (атомарность, согласованность, изоляцию, долговечность) соблюдение. Мультиверсия используется для изоляции транзакций с одного другой.
  • InnoDB обеспечивает автоматическое восстановление после сбоя сервера MySQL или хоста, на котором работает сервер.
  • InnoDB поддерживает внешние ключи и ссылочную целостность, включая каскадные удаления и обновления.
  • MySQL 5.6 основывается на платформе InnoDB, полностью интегрированной в качестве механизма хранения по умолчанию.
  • Постоянная статистика оптимизатора : обеспечивает улучшенную точность статистики индекса InnoDB, а согласованность между MySQL перезапускается.
  • Обрезка кеша таблицы InnoDB: Чтобы упростить загрузку памяти в системах с огромным количеством таблиц, InnoDB теперь освобождает память, связанную с открытой таблицей. Алгоритм LRU выбирает таблицы, которые стали наиболее длинными без доступа.
  • Поддержка полнотекстового поиска: Специальный индекс, индекс FULLTEXT, помогает InnoDB обрабатывать запросы и операции DML с использованием текстовых столбцов и содержащихся в них слов. Эти индексы физически представлены как целые таблицы InnoDB.
  • InnoDB, по-видимому, быстрее работает в полнотекстовом поиске, чем MyISAM

Итак, нет смысла использовать MyISAM Engine, если вы уже обновлены до 5.6, если нет, то не ждите обновления до MySQL 5.6.

Производительность InnoDB VS MyISAM с использованием MySQL 5.6

ответил Mahesh Patil 19 J000000Friday13 2013, 13:45:45
1

MyISAM

MyISAM - это механизм хранения MySQL. До MySQL 5.5 это был механизм хранения по умолчанию для MySQL. Он основан на более раннем модуле хранения данных ISAM. MyISAM оптимизирован для сред с тяжелыми операциями чтения, и несколько записей, или вообще ничего. Причина, по которой MyISAM позволяет быстро читать, - это структура его индексов: каждая запись указывает на запись в файле данных, а указатель смещен от начала файла. Таким образом, записи могут быть быстро прочитаны, особенно если формат FIXED. Таким образом, строки имеют постоянную длину. Типичной областью, в которой можно было бы предпочесть MyISAM, является хранилище данных, поскольку оно связано с запросами на очень больших таблицах, а обновление таких таблиц выполняется, когда база данных не используется (обычно ночью). Вставки также очень легкие, так как новые строки добавляются в конец файла данных. Однако операции удаления и обновления более проблематичны: удаление должно оставлять пустое место, или смещения строк будут меняться; то же самое касается обновлений, так как длина строк становится короче; если обновление делает строку длиннее, строка фрагментирована. Чтобы дефрагментировать строки и потребовать пустое пространство, необходимо выполнить команду OPTIMIZE TABLE. Из-за этого простого механизма статистика индекса MyISAM довольно точна. Другими серьезными недостатками MyISAM являются отсутствие поддержки транзакций и внешних ключей.

InnoDB

InnoDB - это механизм хранения для MySQL. MySQL 5.5 и более поздние версии используют его по умолчанию. Он обеспечивает стандартные функции транзакции, совместимые с ACID, наряду с поддержкой внешнего ключа (декларативная ссылочная целостность). Он реализует транзакции SQL и XA, табличные пространства, индексы FULLTEXT и пространственные операции по стандарту OpenGIS. Он входит в стандартную комплектацию большинства бинарных файлов, распространяемых MySQL AB, исключение составляет некоторые версии OEM. Программное обеспечение имеет двойную лицензию корпорации Oracle; он распространяется по лицензии GNU General Public License, но также может быть лицензирован для сторон, желающих комбинировать InnoDB в проприетарном программном обеспечении.

Вилки

MariaDB имеет механизм хранения под названием Aria, который описывается как «безопасная для пользователя альтернатива MyISAM». В MariaDB и Percona Server по умолчанию используется вилка InnoDB под названием XtraDB. XtraDB поддерживается Percona. Изменения Oracle InnoDB регулярно импортируются в XtraDB, а также исправлены некоторые ошибки и дополнительные функции.

ответил wogsland 9 MarpmThu, 09 Mar 2017 16:33:47 +03002017-03-09T16:33:47+03:0004 2017, 16:33:47

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132