Що є InnoDB
і MyISAM
в MySQL
?
Що є InnoDB
і MyISAM
в MySQL
?
Відповіді:
InnoDB
і MYISAM
, є двигунами зберігання для MySQL
.
Ці два відрізняються за своїм блокуванням: InnoDB
блокує певний рядок у таблиці та MyISAM
блокує всю MySQL
таблицю.
Тип можна вказати, давши MYISAM
АБО InnoDB
під час створення таблиці в БД.
Погляньте
InnoDB - це система зберігання даних для MySQL, включена як стандарт у всі поточні бінарні файли, поширювані MySQL AB. Його основне вдосконалення порівняно з іншими системами зберігання даних, доступними для використання з MySQL, - це підтримка транзакцій, сумісна з ACID
MyISAM є двигуном зберігання за замовчуванням для версій реляційної бази даних MySQL до версії 5.5 1 . Він заснований на старому коді ISAM, але має багато корисних розширень. Основним недоліком MyISAM є відсутність підтримки транзакцій. Версії MySQL 5.5 і новіших версій перейшли на двигун InnoDB, щоб забезпечити референтні обмеження цілісності та більшу конкурентоспроможність.
Вони є двигунами зберігання.
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 (окрім простоти у використанні та хорошої продуктивності без налаштування). Для всіх операцій, де потрібні транзакції, просто дотримуйтесь InnoDB. Однак MyISAM може дійсно прискорити роботу, коли транзакції не потрібні в певних ситуаціях - і вимагає менше місця на диску і оперативної пам’яті порівняно з InnoDB.
Однак, InnoDB постійно покращується:
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, якщо хочеться уникнути ефектів паралельності.
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: оптимізація, резервне копіювання та реплікація" - книга Арджена Ленца, Дерека Дж. Баллінга, Джеремі Заводного, Пітера Зайцева та Вадима Ткаченка
Коли ваш сервер MySQL виходить з ладу, дані можна відновити набагато простіше з набору таблиць MyISAM, ніж з цього великого файлу транзакцій InnoDB. Кожна таблиця MyISAM має окремий файл, і якщо під час аварії в цю таблицю не було зроблено жодних операцій запису - це буде абсолютно не зачеплено. У випадку InnoDB весь файл транзакцій всього сервера MySQL повинен бути реіндексований або все, що він робиться після аварії. Це може стати безладно.
InnoDB за замовчуванням НЕ myISAM https://dev.mysql.com/doc/refman/5.7/en/innodb-introduction.html "InnoDB - це система зберігання даних за замовчуванням MySQL. Якщо ви не налаштували інший механізм зберігання даних за замовчуванням, видавши Оператор CREATE TABLE без пункту ENGINE = створює таблицю InnoDB "