Що се отнася до MySQL, би било трудно да се разберат MyISAM и InnoDB, които са два от най-известните и широко използвани MySQL системи за съхранение. Днес ще говоря с вас за разликата между MyISAM и InnoDB в MySQL...
Какво е MyISAM?
MyISAM е стандартният двигател за съхранение на релационната система за управление на бази данни MySQL (преди версия 5.5)。 Тази структура за съхранение на таблици в MySQL разширява много полезни функции от стария ISAM код. В новата версия на MySQL двигателят InnoDB широко замества MyISAM поради предимствата му по отношение на транзакциите, референтната цялост и по-високата конкурентност. Всяка MyISAM таблица съответства на три файла на твърдия диск. И трите файла имат едно и също име, но имат различни разширения, за да посочат тяхната тип функция: .frm файлът съдържа дефиницията на таблицата, но този файл не е част от MyISAM двигателя, а част от сървъра; .MYD съдържа данните от таблицата; .MYI е индексният файл на таблицата.
Какво е InnoDB?
InnoDB е друг двигател за съхранение на MySQL, а новата версия на стандарта, пусната от MySQL AB, е включена във всички двоични инсталационни пакети.От 5.5 нататък като стандартен двигател за съхранение。 Предимствата му пред други системи за съхранение са поддръжката на ACID-съвместими транзакции (подобно на PostgreSQL) и целостта на параметрите (т.е. поддръжка на външни ключове).
Oracle Corporation придоби Innobase през октомври 2005 г. Innobase използва двойно удостоверяване за автентикация. Той се разпространява чрез GNU и позволява на други групи, които искат да включат InnoDB в търговски софтуер, да получат лиценз.
Най-популярните системи за съхранение са MyISAM и InnoDB. Основните разлики между MyISAM и InnoDB са в производителността и контрола на транзакциите. MyISAM е разширена реализация на ранния ISAM (Indexed Sequential Access Method, ISAM вече не се поддържа след MySQL 5.0), ISAM е проектиран да обработва ситуации, в които честотата на четене е много по-голяма от честотата на запис, така че ISAM и по-късно MyISAM не вземат предвид поддръжката на неща, изключват TPM, не се нуждаят от транзакционни записи, ефективността на ISAM заявките е значителна, а консумацията на памет е много малка. MyISAM наследява тези предимства, като същевременно поддържа крак с голям брой полезни нови функции и свързани инструменти. Например, като се има предвид контролът на конкурентността, се предоставят заключвания на ниво таблица, и въпреки че MyISAM самата не поддържа устойчивост на грешки, тя може да се използва за възстановяване при повреди чрез myisamchk. И тъй като MyISAM използва свои собствени независими файлове за съхранение (MYD data file и MYI index файл) за всяка таблица, е много удобно за архивиране и възстановяване (презаписването на копия е достатъчно), а също така поддържа онлайн възстановяване. В сравнение с други системи за съхранение, MyISAM разполага с повечето инструменти за проверка и ремонт на таблици. MyISAM таблиците могат да се компресират и поддържат пълнотекстово търсене. Те не са безопасни за транзакции и не поддържат външни ключове, така че ако приложението ви не изисква транзакции и обработва само основни CRUD операции, тогава MyISAM е правилният избор. InnoDB е проектиран за ситуации на четене и запис с висока паралелност, използвайки MVCC (Multi-Version Concurrency Control) и заключвания на ниво редове, за да осигури поддръжка на транзакции, съвместими с ACID. InnoDB поддържа целостта на външните референтни ключове и има възможности за възстановяване при грешки. Освен това, производителността на InnoDB всъщност е доста добра, особено при обработка на големи количества данни, официално казано: ефективността на процесора на InnoDB е несравнима с тази на други дисково-базирани релационни системи за съхранение на бази данни. Въпреки това, архивирането и възстановяването на InnoDB са малко по-сложни, освен ако не използвате поддръжката Mulit-tablespace, предоставена от версия 4.1 или по-късно, защото за разлика от MyISAM, файловете с данни на InnoDB не съответстват на всяка таблица независимо. Вместо това се използва споделеното таблично пространство и простият метод за презаписване на копиране не е подходящ за него, затова данните трябва да бъдат възстановени след спиране на MYSQL. Използването на tablespacesd за всяка таблица съответства на отделен файл в tablespace, ситуацията е много по-проста. Той има същите характеристики като BDB типовете и също поддържа външни ключове. Таблиците в InnoDB са бързи и имат по-богати функции от BDB, затова се препоръчва, ако ви трябва транзакционно сигурен двигател за съхранение.
Общо взето, InnoDB е добър избор, ако е необходима поддръжка на транзакции, и има висока честота на едновременно четене и запис. BDB може да се разглежда, ако честотата на едновременното четене и запис не е висока, но BDB вече няма да се поддържа в MySQL 5.1 и по-нови версии. Тази опция изчезна
По подразбиране InnoDB транзакциите са отворени (зададен autocommit = 0), което означава, че всеки път, когато се вмъкне запис, таблицата InnoDB го третира като отделна транзакция. Така че, ако вмъкнем 10 000 записа и не затворим транзакцията, тогава таблицата тип InnoDB ще я третира като 10 000 транзакции, а общото време за вмъкване в този момент е много, в този момент трябва първо да изключим транзакцията и след това да я вмъкнем, така че скоростта ще бъде много висока. Що се отнася до Heap и BDB (Berkeley DB), сравнително погледнато, проникването не е толкова добро, колкото при предишните две, но в някои случаи, Heap storage engine все още е много приложим, който съхранява данни в паметта и е изключително бърз, защото няма чакащ дисков вход/изход. Но тъй като е двигател за съхранение на памет, всички направени модификации ще изчезнат след рестартирането на сървъра. Heap е чудесно място за използване на BDB за тестване, тъй като това е първият транзакционно сигурен двигател за съхранение на MySQL. Изграден на базата данни Berkeley DB и е също така транзакционно сигурен, но BDB очевидно не е толкова популярен, колкото InnoDB, тъй като повечето системи за съхранение в MySQL, които поддържат транзакции, също търсят MVCC или двигатели за заключване на ниво редове, докато BDB поддържа само блокировка на ниво страница.
InnoDB двигател
InnoDB е транзакционен двигател за съхранение, който поддържа връщане назад и е проектиран да предоставя високопроизводителни услуги при обработка на големи обеми данни, като създава буферни пулове в паметта по време на изпълнение, за да буферира данни и индекси.
Предимства на двигателя InnoDB:
1. Поддържане на функции за обработка на транзакции и ACID транзакции;
2. Реализирани са четири нива на изолация на SQL стандарта;
3. Поддържане на ограничения за заключване на ниво ред и външни ключове;
4. Можете да използвате транзакционни логове за възстановяване на данни.
5. Нивото на заключване е заключване на редове, което е подходящо за чести модификации на таблици с висока паралелност, а високата паралелност е по-добра от MyISAM. Недостатъкът е, че консумацията на системата е голяма.
6. Индексът не само се кешира сам, но и кешира данни, което изисква повече памет от MyISAM.
Недостатъци на InnoDB енджина:
Тъй като не запазва броя на редовете в таблицата, цялата таблица се сканира при използване на статистиката COUNT.
Двигател MyISAM
MyISAM е двигателят по подразбиране преди MySQL 5.5.5 и е проектиран да чете бързо.
Предимства на двигателя MyISAM:
1. Високоефективно четене;
2. Тъй като запазва броя на редовете в таблицата, цялата таблица няма да бъде сканирана при използване на статистиката COUNT;
Недостатъци на двигателя MyISAM:
1. Нивото на заключване е заключване на маса, а предимството на часовниковия катинар е, че отгоре е малко, а ключалката е бърза; Недостатъците са, че грануларността на заключването е голяма, вероятността за импулс на заключване е висока, а капацитетът за паралелност е нисък, което е подходящо за услуги, базирани на заявки.
2. Този двигател не поддържа транзакции или външни ключове.
3. Операциите INSERT и UPDATE трябва да заключат цялата таблица;
4. Той съхранява броя на редовете в таблицата, така че при SELECT COUNT(*) FROM TABLE, трябва само директно да прочете запазените стойности, без да сканира цялата таблица.
Приложими сценарии
MyISAM е подходящ за: (1) извършване на много броячни изчисления; (2) Рядко въвеждане и много чести запитвания; (3) Няма бизнес.
InnoDB е подходящ за: (1) високи изисквания за надеждност или транзакции; (2) Актуализациите и заявките на таблиците са доста чести, а вероятността за заключване на таблици е сравнително висока.
Сравнение на таблици
| Свойства | MyISAM | Купчина | BDB | InnoDB | | Транзакции | Не се поддържа | Не се поддържа | Подкрепям някого | Подкрепям някого | | Грануларност на заключването | Заключване на маса | Заключване на маса | Заключване на страница (страница, 8KB) | Шлюз | | съхранение | Разделени файлове | в паметта | Един файл за всяка таблица | Таблично пространство | | Ниво на изолация | не | не | Прочетете отдаден | Всички | | Преносим формат | съм | Н/Д | не | съм | | Пълнота на цитирането | не | не | не | съм | | Първичен ключ на данни | не | не | съм | съм | | MySQL кешира записи с данни | не | Да | Да | Да | | ползваемост | Пълна версия | Пълна версия | MySQL-Max | Пълна версия |
Някои разлики в детайлите
1. InnoDB не поддържа индекси от тип FULLTEXT, който се поддържа от MySQL 5.6 (експериментален).
2. InnoDB не запазва конкретния брой редове в таблицата, тоест при изпълнение на select count() от таблицата, InnoDB трябва да сканира цялата таблица, за да изчисли колко редове има, но MyISAM трябва само да прочете броя на запазените редове. Обърнете внимание, че когато операторът count() съдържа условие where , операцията е една и съща и за двете таблици.
3. За полета от AUTO_INCREMENT тип InnoDB трябва да съдържа индекс само с това поле, но в таблицата MyISAM можете да създадете съвместен индекс с други полета.
4. Когато ИЗТРИЕТЕ ОТ таблицата, InnoDB няма да създаде таблицата отново, а ще я изтрие ред по ред.
5. Операцията LOAD TABLE FROM MASTER не работи за InnoDB, решението е първо да се промени InnoDB таблицата с MyISAM, да се импортират данните и след това да се превърне в InnoDB таблицата, но не е приложима за таблица, която използва допълнителни функции на InnoDB (като външни ключове).
6. Освен това, заключването на реда в таблицата на InnoDB не е абсолютно; ако MySQL не може да определи диапазона, който трябва да се сканира при изпълнение на SQL оператор, таблицата на InnoDB ще заключи и цялата таблица.
7. InnoDB не поддържа пълнотекстово индексиране, докато MyISAM поддържа. Индексирането на пълен текст се отнася до създаване на обратен ред на всяка дума в символ, вархар и текст (с изключение на стоп думи). Индексът за пълен текст на MyISAM всъщност е безполезен, защото не поддържа сегментиране на китайски думи и трябва да бъде записан в таблицата с данни от потребителя след сегментацията на думата, а думите с по-малко от 4 китайски знака ще бъдат игнорирани като стоп думи.
|