MySQL хранилища за данни (storage engines)

Една от забележителните екстри на MySQL, в допълнение на това, че е безплатна, широко поддържана и бърза, е гъвкавостта при избора на различни хранилища за данни (storage engines) за различни таблици.

MySQL 5.7 идва с 10 различни типа хранилища за данни, включително „example“, което позволява да вградите свое собствено хранилище.

Всяко хранилище за данни е напълно различно и е проектирано да отговори на уникалните нужди на даден тип приложение.

Това, че не сте ограничени в рамките на един единствен тип хранилище означава, че можете да оптимизирате и изберете най-добрата комбинация от различни хранилища за Вашия проект.

Какви хранилища поддържа MySQL?

Хранилищата за данни са компоненти на MySQL, които обработват SQL операциите за различни типове таблици. InnoDB е основното (default) хранилище с най-общо предназначение.

Може да видите какви хранилища поддържа Вашият MySQL сървър в терминал с командата show engines или show engines\G (предоставя различно форматиране на отговора).

Поддържани хранилища на дадения MySQL сървър.
Поддържани хранилища на дадения MySQL сървър.

Стойността в колоната Support показва дали дадено хранилище може да бъде използвано. Стойност YES, NO или DEFAULT показва, че хранилището е налично, не е налично или е налично и е зададено като хранилище по подразбиране.

MySQL 5.7 хранилища за данни

InnoDB

InnoDB е хранилището за данни по подразбиране в MySQL 5.7.

  • InnoDB е проектирано за постигане на CPU ефективност и максимална производителност при обработка на големи обеми данни;
  • DML (Data Manipulation Language) операциите добавяне, актуализиране и изтриване на данни са съвместими с модела ACID (atomic, consistent, isolated and durable), с транзакции, включващи възможности за обвързване (commit), връщане назад (rollback) и възстановяване при срив (crash-recovery), за защита на потребителските данни;
  • Заключването на ниво ред (блокират се единични записи – редове) увеличават конкурентоспособността и производителността на много потребители едновременно;
  • Всички ключове (locks) на InnoDB, държани от дадена транзакция, се освобождават, когато транзакцията е извършена или анулирана;
  • InnoDB таблиците подреждат данните на диск, за да оптимизират заявките въз основа на първичните ключове (primary keys);
  • InnoDB поддържа ограниченията на FOREIGN KEY за поддържане целостта на данните. Поради това вмъкванията, актуализациите и изтриванията се проверяват, за да се гарантира, че те не водят до несъответствия в различните таблици;
  • Можете да смесвате InnoDB таблици с таблици на други MySQL хранилища в рамките на една и съща операция. Например, може да използвате join операция за да комбинирате данни от InnoDB и MEMORY таблици в една заявка.

MyISAM

Преди MySQL 5.5.5, MyISAM е хранилището на данни по подразбиране.

Всяка MyISAM таблица се съхранява на диск в три файла. Файловете имат имена, които започват с името на таблицата и имат разширение, което показва типа на файла:

  • Файлът .frm съхранява формата на таблицата;
  • Файлът с данни има разширение .MYD (MYData);
  • Индексният файл има разширение .MYI (MYIndex).

MyISAM съдържа много функции, като пълно текстово индексиране, компресиране и пространствени (OpenGIS геометрични модели) функции. MyISAM не поддържа транзакции или заключване на ниво ред (row-level locks).

Най-голямата слабост на MyISAM несъмнено е фактът, че хранилището не е осигурено при срив (crash-safe). Ако имате нужда от данни само за четене, или ако таблиците не са големи и няма да е проблем да се поправят периодично, може да използвате MyISAM в проектите си.

Можете да проверите (check) или поправите (repair) MyISAM таблици през phpMyAdmin или терминал с mysqlcheck клиент или myisamchk команда. Можете също така да компресирате MyISAM таблици с myisampack, за да заемат много по-малко място.

Memory

Хранилището за данни Memory съхранява всички данни в RAM, за бърз достъп в среди, които изискват бързо търсене на некритични данни. Това хранилище е било познато и под името HEAP. Случаите на употреба на хранилището Memory намаляват.

InnoDB с неговата буферна зона за памет (buffer pool) осигурява универсален и траен начин за запазване на повечето или всички данни в паметта и NDBCLUSTER осигурява бързи ключ-стойност търсения (key-value lookups) за огромни разпределени масиви от данни.

CSV

CSV (comma-separated values) таблиците са текстови файлове със стойности, разделени със запетая. CSV таблиците Ви позволяват да импортирате или изпращате данни във формат CSV, за да обменяте данни със скриптове и приложения, които четат и записват в същия формат.

Тъй като таблиците CSV не се индексират, те обикновено съхраняват данните си в InnoDB таблици по време на нормална работа и използват CSV таблици само по време на импортиране или експортиране.

Archive

Тези компактни, недекларирани таблици са предназначени за съхраняване и извличане на големи количества от рядко срещана историческа, архивна или одиторска информация.

Blackhole

Хранилището за данни Blackhole приема, но не съхранява данни, подобно на Unix /dev/nulldevice. Запитванията винаги връщат празен отговор. Тези таблици могат да се използват при конфигуриране на репликация, където DML изявленията се изпращат на подчинени (slave) сървъри, но главният сървър не съхранява собствено копие на данните.

NDB

NDB (известно също като NDBCLUSTER) хранилището с клъстерни бази данни е особено подходящо за приложения, които изискват възможно най-висока степен на работа (uptime) и достъпност.

Merge

Позволява на MySQL DBA или разработчик логически да групира поредица от идентични MyISAM таблици и да ги препраща като един обект. Добър за VLDB (Very Large Databases) среди като хранилище на данни.

Federated

Предоставя възможност за свързване на отделни MySQL сървъри, за създаване на една обща логическа база данни от много физически сървъри. Много добър за създаване на разпределена среда или информационни read-only масиви (data mart).

Example

Това хранилище служи като пример в изходния код на MySQL, който илюстрира как да започнете да създавате ново хранилище. Може да създавате таблици с това хранилище, но не може да се съхраняват или извличат данни от тях.

Обновена: 02.04.2022

Беше ли Ви полезна тази статия?

Вижте още