Які основні відмінності між 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/uk/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_buffer_size ) з урахуванням поточного набору даних ( запит обмежує рекомендацію на рівні 4G (4096M). Для 32-бітної ОС 4 ГБ - це обмеження. Для 64-розрядних 8 Гб.
Основним механізмом, який використовується, є буферний басейн 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)
дає налаштування в гігабайтНе існує замінника здорового глузду. Якщо у вас обмежена пам’ять, суміш двигунів зберігання даних або їх комбінація, вам доведеться налаштувати різні сценарії.
Можливі сценарії нескінченні !!!
Пам’ятайте, що б ви не виділили, залиште достатню кількість оперативної пам’яті для підключень DB та операційної системи.
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 забезпечує блокування рівня таблиці, пошук FULLTEXT. MYISAM має найбільш гнучку колонку AUTO_INCREMENTED, що обробляє всі системи зберігання. MYISAM не підтримує транзакції.
INNODB
INNODB - двигун безпечного зберігання транзакцій. INNODB має можливості фіксації, відкату та відновлення після аварій. INNODB підтримує референтну цілісність зовнішнього ключа.
Включає зміни MySQL 5.6
ДВИГАТЕЛЬНЕ ЗБЕРІГАННЯ:
Отже, немає сенсу використовувати MyISAM
Engine, якщо ви вже оновлені до 5.6, якщо ні, то не чекайте оновлення до 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, додаються деякі виправлення помилок та додаткові функції.