Що таке InnoDB та MyISAM в MySQL?


121

Що є InnoDBі MyISAMв MySQL?


8
Дублікат MySql: MyISAM проти Inno DB! або ви можете взяти свій вибір: stackoverflow.com/search?q=myisam+vs+innodb
OMG Ponies,

Це двигун бази даних ... kavoir.com/2009/09/…
Матьє

чи можемо ми використовувати обидва двигуни зберігання даних для нашої бази даних одночасно?
user130561

1
Ви можете їх одночасно на різних таблицях, але для однієї заданої таблиці вам потрібно вибрати, яку саме ви хочете використовувати ...
Matthieu

Відповіді:


110

InnoDBі MYISAM, є двигунами зберігання для MySQL.

Ці два відрізняються за своїм блокуванням: InnoDBблокує певний рядок у таблиці та MyISAMблокує всю MySQLтаблицю.

Тип можна вказати, давши MYISAMАБО InnoDBпід час створення таблиці в БД.


Чітка і проста відповідь.
vadiraj jahagirdar

38

Погляньте

InnoDB та MyISAM

InnoDB - це система зберігання даних для MySQL, включена як стандарт у всі поточні бінарні файли, поширювані MySQL AB. Його основне вдосконалення порівняно з іншими системами зберігання даних, доступними для використання з MySQL, - це підтримка транзакцій, сумісна з ACID

MyISAM є двигуном зберігання за замовчуванням для версій реляційної бази даних MySQL до версії 5.5 1 . Він заснований на старому коді ISAM, але має багато корисних розширень. Основним недоліком MyISAM є відсутність підтримки транзакцій. Версії MySQL 5.5 і новіших версій перейшли на двигун InnoDB, щоб забезпечити референтні обмеження цілісності та більшу конкурентоспроможність.


1
чи можемо ми використовувати обидва двигуни зберігання даних для нашої бази даних одночасно?
user130561

2
ви можете, оскільки для кожної таблиці ви можете визначити інший механізм зберігання даних. інше питання, якщо ви повинні. в документації на mysql є кілька пояснень на цю тему.
nano7

18

Вони є двигунами зберігання.

http://dev.mysql.com/doc/refman/5.1/uk/storage-engines.html

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

InnoDB: двигун зберігання даних для MySQL, безпечний для транзакцій (сумісний з ACID), який має можливість фіксації, відкату та відновлення після аварійного захисту для захисту даних користувачів. Блокування на рівні рядків InnoDB (без ескалації до більш чітких замкових деталей) та послідовне читання, що розблоковує стиль Oracle, збільшують одночасність та ефективність роботи багатьох користувачів. InnoDB зберігає дані користувачів у кластерних індексах для зменшення вводу / виводу для загальних запитів на основі первинних ключів. Для підтримки цілісності даних InnoDB також підтримує обмеження щодо референтної цілісності FOREIGN KEY.


Тож при встановленні MySQL нам потрібно конкретизувати, який механізм зберігання даних використовувати як нашу базу даних MySQL?
user130561

3
Як було сказано в моєму дописі, за замовчуванням - MyISAM. Якщо ви хочете використовувати функції іншого механізму зберігання даних, такого як INNODB, тоді так, вам потрібно буде вказати. Це не робиться під час встановлення, скоріше це робиться під час створення початкової таблиці.
mluebke

3
Але відповідно до цього: - dev.mysql.com/doc/refman/5.7/en/storage-engines.html ; Двигун за замовчуванням - InnoDB.
Харша

2
Відповідно до dev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html : "Двигун за замовчуванням - InnoDB станом на MySQL 5.5.5 (MyISAM до 5.5.5)" Отже, двигун за замовчуванням зараз InnoDB. Ця відповідь була розміщена через 16 днів після першого випуску загальної доступності з InnoDB як двигуна за замовчуванням;)
SOFe

6

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

Однак, InnoDB постійно покращується:

InnoDB 1.1 Підвищення продуктивності та масштабованості


4

MyISAM не слідкує за ACID на відміну від InnoDB, який слідкує за транзакціями для підтримки цілісності даних.

MyISAM підтримує паралельні вставки: Якщо в таблиці немає вільних блоків у середині файлу даних, ви можете ВСТАВИТИ в неї нові рядки одночасно, коли інші таблиці читають з таблиці. MySqlDoc

Ось чому MyISAM швидше і займає менше місця. Наприклад, MySQL MyISAM Storage Engine не підтримує транзакцій. обмеження MySQL MYISAM Існує біт, який називається concurrent-insert За замовчуванням змінна встановлюється в 1, а одночасні вставки обробляються як тільки описано. Якщо вона встановлена ​​на 0, паралельні вставки вимикаються. Якщо вона встановлена ​​в 2, паралельні вставки в кінці таблиці дозволяються навіть для таблиць, які видалили рядки. Оператор INSERT може бути виконаний для додавання рядків до кінця таблиці з виділенням одночасно, якщо в середині таблиці немає отворів / видалених рядків (під час паралельної вставки).

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


3

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

У таблиці InnoDB (транзакцій) зміни транзакцій можна легко скасувати, якщо потрібен відкат. Але зміни, внесені до таблиці без транзакцій MyISAM, не можуть бути скасовані, коли потрібно повернути транзакцію.

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

1 START TRANSACTION;
2 SELECT balance FROM checking WHERE customer_id = 10233276;
3 UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276;
4 UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276;
5 COMMIT;

Припустимо, процес виходить з ладу на кроці 4. Якщо тут використовується таблиця InnoDB, відкат скасує зміни, і ви врятуєтесь від ризику втрати грошей. Буквально таблиця не знає про будь-який збій, оскільки зміни не будуть вноситись до таблиці, якщо крок 5 не буде успішно виконаний.

Але у випадку таблиці MyISAM не можна скасувати зміни транзакцій, коли викликається відкат або якщо відбувається збій, що призводить до збою транзакції. Це означає, що якщо транзакція відбулася на етапі 3, гроші будуть списані з вашого розрахункового рахунку. Але гроші не були б додані на ваш ощадний рахунок.

Приклад ввічливості: "Високопродуктивний MySQL: оптимізація, резервне копіювання та реплікація" - книга Арджена Ленца, Дерека Дж. Баллінга, Джеремі Заводного, Пітера Зайцева та Вадима Ткаченка


1

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


0

InnoDB за замовчуванням НЕ myISAM https://dev.mysql.com/doc/refman/5.7/en/innodb-introduction.html "InnoDB - це система зберігання даних за замовчуванням MySQL. Якщо ви не налаштували інший механізм зберігання даних за замовчуванням, видавши Оператор CREATE TABLE без пункту ENGINE = створює таблицю InnoDB "

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