Чим відрізняється InnoDB від MyISAM?


17

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


сміливо додайте також тег MySQL :)
Йоган

Чи не належить це до потокового потоку?
ripper234

@ ripper234. Дві кращі версії цього допису (набагато більше довідки; більше демонстрації попередніх досліджень) існують на SO: stackoverflow.com/q/12614541/209139 та stackoverflow.com/q/20148/209139 .
TRiG

Відповіді:


14

ISAM = Індексований метод послідовного доступу і по суті є плоским файлом (для тих DBA, які можуть запам'ятати, подумати Btrieve або B-Tree). Це дуже стара технологія - але не дозволяйте це відкласти вас від використання її. Оскільки це плоский файл (докладніше про це пізніше), він не є реляційним, і, таким чином, не є RDBMS, і, отже, є більш доцільним у деяких ситуаціях.

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

ISAM є геніальним, якщо у вас є багато записів (наприклад, 20 мільйонів), а записи переважно автономні (тобто вам не потрібно робити багато посилань, щоб отримати пов’язані дані). Він дуже покладається на індекси, і якщо у вас немає правильного індексу, будьте готові до дуже довгих запитів. Справа в суті: У нас була таблиця IS Btrieve ISAM з записами 20M +, і зробити витяг та фільтрувати дані на основі точного індексу було майже миттєво. Використовувати неправильний індекс було буквально 15 хвилин.

InnoDB чудово підходить, якщо у вас багато реляційних зв’язків. Таблиця A посилається на поле в таблиці B, на яке посилаються таблиці C і D. InnoDB може отримати ці записи, використовуючи всілякі приємні методи з'єднання (хеш-з'єднання тощо), тоді як база даних ISAM повинна запускати кілька підзапитів для кожного окремого рядок і відповідність записів вручну.

Вам дійсно доведеться пройти курс баз даних, якщо ви хочете набагато детальніше, ніж це!


ISAM такий же реляційний, як і все інше, він просто не оптимізований для цього.
LapTop006

дякую 4 ваш короткий опис. Зараз в основному я очищений

5

Найбільш фундаментальним є те, що InnoDB є транзакційним. MyIsam - ні. MyIsam, як правило, трохи швидше, тому якщо вам не потрібні транзакції, це, як правило, найкраща ставка. Для детального опису слід ознайомитися з документацією на MySQL.


2

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

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

Так чи інакше, ви повинні налаштувати MySQL, оскільки типово налаштовані параметри для пентію 32 Мб, який спільний з іншими службами.


2

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

Як правило, правило: якщо ви хочете швидкості, використовуйте MyISAM, а якщо вам потрібна стабільність, використовуйте InnoDB. Щось спільного з атомністю, якщо я правильно пам'ятаю.


3
Виняток, що вже не відповідає дійсності, InnoDB насправді швидше в більшості випадків.
LapTop006

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