Які основні відмінності між InnoDB та MyISAM?


245

Які основні відмінності між InnoDB та MyISAM?


23
Якщо ви хочете двигун бази даних, використовуйте InnoDB. Ви не можете порівняти два .
Джеремі Штейн

Незважаючи на те, що багато відповідей нижче правильні, вони не чітко збивають, IMHO Цей сайт і є головним: InnoDB блокується на рівні рядків, MyISAM - блокування на рівні таблиці. Це означає, що, як правило, MyISAM буде кращим для OLAP (аналітика, здебільшого зчитує), а InnoDB - кращою для OLTP (транзакції, в основному, записує або, принаймні, багато пише).
Майк Вільямсон,

Відповіді:


159

Перша основна відмінність, яку я бачу, полягає в тому, що InnoDB реалізує блокування на рівні рядків, тоді як MyISAM може робити лише блокування на рівні таблиці. Ви знайдете краще відновлення аварійних ситуацій в InnoDB. Однак, він не має FULLTEXTпошукових індексів до v5.6, як і MyISAM. InnoDB також реалізує транзакції, зовнішні ключі та обмеження відносин, в той час як MyISAM цього не робить.

Список може піти трохи далі. Однак вони мають унікальні переваги на користь і недоліки. Кожен з них підходить в деяких сценаріях, ніж в іншому.

Отже, підсумовуючи ( TL; DR ):

  • InnoDB має блокування на рівні рядків, MyISAM може робити лише повне блокування на рівні таблиці.
  • InnoDB покращує відновлення після аварійного завершення.
  • MyISAM має FULLTEXTпошукові індекси, InnoDB - до MySQL 5.6 (лютий 2013).
  • InnoDB реалізує транзакції, зовнішні ключі та обмеження відносин, MyISAM не робить.

шановний пане, так що в кінцевому підсумку для чого користуватися? MyISAM чи InnoDB? я абсолютно заплутаний ... мій веб-сайт використовує mysql, і мені потрібно вирішити це.
sqlchild

3
Залежно від програми, запишіть список із необхідними функціями (наприклад, пошук у повнотекстовому форматі, зовнішні ключі ...) і спробуйте визначитися з одним (спробуйте оцінити кожну функцію і потім порахуйте бал). Ви не зможете мати їх усіх, але вирішувати, що функція відьом потрібна найбільше.
poelinca

2
Я відредагував його пост для уточнення.
Mathias Lykkegaard Lorenzen

1
@MathiasLykkegaardLorenzen дякую, це одна з причин, що нам подобається stackexchange
poelinca

станом на version 5.6.4InnoDB підтримує FULLTEXTпошук. dev.mysql.com/doc/refman/5.6/uk/fulltext-restrictions.html
daydreamer

85

Ще одна основна відмінність, про яку ще не було сказано, - це кешування кожного двигуна зберігання даних.

МІЙСАМ

Основний механізм, який використовується, - кеш-ключ. Він кешує лише індексні сторінки з файлів .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_buffer_size ) з урахуванням поточного набору даних ( запит обмежує рекомендацію на рівні 4G (4096M). Для 32-бітної ОС 4 ГБ - це обмеження. Для 64-розрядних 8 Гб.

InnoDB

Основним механізмом, який використовується, є буферний басейн 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). Для простоти, враховуючи лише два файли журналу, ось як ви можете розмістити їх:

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

КАВАТИ

В кінці обох запитів знаходиться вбудований запит (SELECT 2 PowerOf1024)B

  • (SELECT 0 PowerOf1024) дає налаштування в байтах
  • (SELECT 1 PowerOf1024) дає налаштування в кілобайт
  • (SELECT 2 PowerOf1024) дає налаштування в мегабайтах
  • (SELECT 3 PowerOf1024) дає налаштування в гігабайт
  • Не приймаються повноваження, менші 0 або більше 3

ЕПІЛОГ

Не існує замінника здорового глузду. Якщо у вас обмежена пам’ять, суміш двигунів зберігання даних або їх комбінація, вам доведеться налаштувати різні сценарії.

  • Якщо у вас є 2 Гб оперативної пам’яті та 16 Гб InnoDB, виділіть 512М як innodb_buffer_pool.
  • Якщо у вас є 2 Гб оперативної пам’яті та 4 ГБ індексів MyISAM, виділіть 512М як розмір ключа_буфер.
  • Якщо у вас є 2 ГБ оперативної пам’яті та 4 ГБ індексів MyISAM та 16 Гб InnoDB, виділіть 512М як ключ_буфер_розмір, а 512М - як innodb_buffer_pool_size.

Можливі сценарії нескінченні !!!

Пам’ятайте, що б ви не виділили, залиште достатню кількість оперативної пам’яті для підключень DB та операційної системи.


Це погані формули!
Рік Джеймс

(На жаль, не забудьте не мати абзаців) ... Я додам "відповідь".
Рік Джеймс

Формули Роландо для розмірів кешу не практичні. - Повноваження 2 не потрібні. - 4 Гб на 32-бітній ОС неможливо - і т. Д. Ось мій переклад про те, що їх встановити: mysql.rjweb.org/doc.php/memory (Він стосується різних інших параметрів, які впливають на використання пам'яті.)
Рік Джеймс

2
@ Rick: Повноваження 2 повинні були відображати відповіді в різних одиницях. Doing (SELECT 2 PowerOfTwo) Встановлює відображення відповіді в МБ. Doing (SELECT 3 PowerOfTwo) Встановлює дисплей у ГБ. (SELECT 1 PowerOfTwo) Відображається в КБ. (SELECT 0 PowerOfTwo) Відображає в байтах. Ось що робить (SELECT 2 PowerOfTwo). Отже, потрібно ДИСПЛЕКУВАТИ САМО, а не нав'язувати будь-які припущені значення в архітектурі.
RolandoMySQLDBA

2
@Rick: Ви знаєте, що? Я фактично дам вам +1 з двох дуже великих причин. 1) Ваша URL-адреса підтверджує, що моя відповідь була правильною, оскільки 4 ГБ - це найбільше число, яке присвоюється розміру key_buffer_size. 2) Ваша відповідь із URL-адресою має сенс для машин із дуже низькою пам'яттю. Я дам кредит там, де належить кредит.
RolandoMySQLDBA

60

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не використовується)
  • повна індексація тексту (оновлення: підтримується в InnoDB від MySQL 5.6)
  • менший слід диска
  • дуже високе стиснення таблиці (лише для читання)
  • типи просторових даних та індекси (дерево дерева) (оновлення: підтримується в InnoDB від MySQL 5.7)

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

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


5
Я прочитав вашу відповідь і порівняв її з іншими вже тут. Твій єдиний згадує BLOB. Їх зазвичай приймають як належне. Ваш також є єдиним, хто згадує про myisampack, одного з невідомих героїв швидкочитаних таблиць MyISAM. Ваш сьогодні +1!
RolandoMySQLDBA

2
Прикладом може бути стисла таблиця лише для читання, де ви нечасто оновлюєте її, повністю замінивши таблицю.
dabest1

30

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

В основному, якщо у вас є інша копія даних і кешуєте їх лише в MySQL, наприклад, щоб дозволити стандартний спосіб доступу до неї з веб-сайту PHP, то MyISAM чудово (тобто, це краще, ніж плоский файл CSV або логічний файл для запитів і паралельний доступ). Якщо база даних є фактичною "основною копією" даних, якщо ви робите INSERTта UPDATEвикористовуєте реальних даних від користувачів, то безглуздо використовувати що-небудь, крім InnoDB, у будь-якому масштабі MyISAM є ненадійним і важко керувати, ви Я буду робити myisamchkполовину часу, заперечуючи будь-які підвищення продуктивності ...

(Мій особистий досвід: 2 терабайтних БД в MyISAM).


29

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

Індексація FULLTEXT

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

Однак це не є вагомою причиною використання MyISAM. Найкраще перейти на хостинг-провайдера, який підтримує сучасні версії MySQL. Не те, що таблиця MyISAM, яка використовує індексацію FULLTEXT, не може бути перетворена в таблицю InnoDB.

Висновок

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


1
Дякую, дійсно інформативний та чіткий підсумок.
informatik01

18

На мій досвід, найбільш суттєвою різницею є те, як кожен двигун обробляє блокування. InnoDB використовує блокування рядків, а MyISAM використовує блокування таблиці. Як правило, я використовую InnoDB для написання важких таблиць, а MyISAM - для читання важких таблиць.

Інші важливі відмінності включають:

  1. Підтримка транзакцій InnoDB та зовнішні ключі. MyISAM ні.
  2. MyISAM використовує повну індексацію тексту.
  3. MyISAM виконує незадовільну роботу щодо забезпечення цілісності даних.

Застаріле - InnoDB зараз має FULLTEXTі SPATIAL. InnoDB хороший як для важких навантажень для читання, так і для запису.
Рік Джеймс

8

Я схильний розглядати MyISAM як вибір таблиці за замовчуванням для MySQL, тому я зазначу відмінності для більшості користувачів InnoDB

  • Рівень блокування рівнів
  • Застосування закордонних ключів
  • Підтримка транзакцій
  • Продуктивність потрапила в системи високого використання

5
за винятком останньої версії MySQL більше не використовується MyISAM як двигун за замовчуванням. У 5.5 вони змінили за замовчуванням InnoDB :). І я не погоджуюся з узагальненням того, що InnoDB взагалі просто отримує «хіт на продуктивність». Добре розроблені таблиці InnoDB з належним індексуванням та добре налаштованими налаштуваннями пам’яті можуть змусити таблицю InnoDB виконати так само, як і та сама схема в MyISAM
TechieGurl

3
У багатьох ситуаціях з високим рівнем використання InnoDB насправді працює краще, ніж MyISAM. MyISAM - це специфічний інструмент для вирішення конкретної проблеми, тоді як InnoDB служить вам краще у більшості ситуацій (отже, чому команда MySQL зробила його двигуном за замовчуванням). Це тому, що MyISAM був єдиним двигуном протягом тривалого часу, коли спільнота MySQL переросла у звичку використовувати MyISAM за замовчуванням навіть після дозрівання InnoDB.
Nick Chammas

2
FULLTEXT пошук InnoDB був доданий частково через цикл розробки MySQL 5.6. Згадана URL-адреса охоплює також InnoDB.
Макс Вебстер

5

МІЙСАМ

MYISAM забезпечує блокування рівня таблиці, пошук FULLTEXT. MYISAM має найбільш гнучку колонку AUTO_INCREMENTED, що обробляє всі системи зберігання. MYISAM не підтримує транзакції.

INNODB

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


5

Включає зміни MySQL 5.6

ДВИГАТЕЛЬНЕ ЗБЕРІГАННЯ:

  • Він забезпечує повну відповідність кислотній кислоті (атомність, консистенція, ізоляція, довговічність). Мульти-версія використовується для ізоляції транзакцій одна від одної.
  • InnoDB забезпечує автоматичне відновлення після збою сервера MySQL або хоста, на якому працює сервер.
  • InnoDB підтримує зовнішні ключі та референтну цілісність, включаючи каскадні видалення та оновлення.
  • MySQL 5.6 будується на платформі InnoDB, повністю інтегрованої як двигун зберігання за замовчуванням
  • Постійна статистика оптимізатора : забезпечує покращену точність статистики індексу InnoDB та послідовність перезапуску MySQL.
  • Обрізання кешу таблиці InnoDB: Щоб полегшити завантаження пам'яті в системах з величезною кількістю таблиць, InnoDB тепер звільняє пам'ять, пов'язану з відкритою таблицею. Алгоритм LRU вибирає таблиці, які пройшли найдовше без доступу до них.
  • Підтримка повнотекстового пошуку: спеціальний вид індексу, індекс FULLTEXT, допомагає InnoDB працювати з запитами та операціями DML, що містять текстові стовпці та слова, які вони містять. Ці індекси фізично представлені як цілі таблиці InnoDB.
  • Здається, InnoDB набагато швидший у повнотекстовому пошуку, ніж у MyISAM

Отже, немає сенсу використовувати MyISAMEngine, якщо ви вже оновлені до 5.6, якщо ні, то не чекайте оновлення до MySQL 5.6.

Продуктивність InnoDB VS MyISAM за допомогою MySQL 5.6


2

MyISAM

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

InnoDB

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, додаються деякі виправлення помилок та додаткові функції.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.