MyISAM е една от най-популярните машини за съхранение в MySQL. MyISAM често е вторият избор след InnoDB – в тази публикация в блога ще се опитаме да разберем как най-добре да работим с този двигател.
Какво е MyISAM?
MyISAM е една от машините за съхранение на MySQL. MyISAM се базира на ISAM (Indexed Sequential Access Method), алгоритъм за индексиране, разработен от IBM, който позволява бързо извличане на информация от големи набори от данни. Въпреки това, той не се справя много добре при едновременно четене от и запис на една таблица, поради заключване на таблицата. Освен това не поддържа транзакции.
За някои MySQL инженери този двигател е най-популярният избор след InnoDB:механизмът за съхранение на MyISAM беше единствената машина за съхранение, предоставена от MySQL през 2005 г. и беше достъпна за използване повече от 20 години. MyISAM беше машината за съхранение по подразбиране за MySQL до версия 5.5.
MyISAM отвътре
Илюстрация на това как MyISAM работи отвътре не е в обхвата на този блог, но можем да ви предоставим настройките, които ви помагат да оптимизирате производителността на двигателя:
- Myisam_sort_buffer_size дефинира буфера, който се разпределя, когато индексът се сортира чрез изпълнение на заявки REPAIR, CREATE INDEX или ALTER TABLE.
- Key_buffer_size определя размера на буфера, използван за индексни блокове в MyISAM таблици. Увеличаването на този параметър може да доведе до по-добра обработка на индекса.
- Sort_buffer_size описва размера на буфера, който се разпределя за нишки, които трябва да извършват операции по сортиране.
- Read_buffer_size описва размера на буфера, който се разпределя за нишки, които изпълняват операции по последователно сканиране.
- Write_buffer_size описва размера на буфера за запис.
Тези четири параметъра са важни, но въпреки че са важни, трябва да следите и променливата key_buffer_size. Променливата key_buffer_size определя размера на индексните буфери, съхранявани в паметта - мислете за нея като за аналог innodb_buffer_pool_size, но за MyISAM. Ако вашите сървъри се състоят предимно от MyISAM таблици, можете да разпределите около 25% или повече от наличната RAM памет на сървъра към променливата key_buffer_size. Има и друг начин да определите каква трябва да бъде стойността на параметъра key_buffer_size - просто сравнете стойността на key_read_requests (общата стойност на заявките за четене на индекс) и стойността на key_reads (стойността на key_reads е броят на заявките, които трябва да бъдат четене от диск). Стойностите за тези параметри могат да бъдат извлечени, като се разгледат променливите на състоянието на сървъра (просто издайте заявка SHOW GLOBAL STATUS на вашия MySQL сървър). Също така е полезно да имате предвид, че ако key_reads връща голяма стойност, стойността на key_buffer_size вероятно е твърде малка.
MyISAM и MySQL 8.0
Ако попитате някои MySQL инженери, те ще кажат, че MyISAM повече не трябва да се използва. Защо? Е, някои хора казват това поради факта, че когато MySQL напредна, те добавиха по-голямата част от функциите, които преди можеха да се видят само в MyISAM, в InnoDB, което ефективно направи MyISAM остарял:
- Пълнотекстовите индекси са налични в InnoDB от версия 5.6.
- Преносимите пространства за таблици станаха достъпни в InnoDB от версия 5.6.
- Пространствените индекси станаха достъпни в InnoDB от версия 5.7.
- Последната актуализация за таблицата стана налична в InnoDB след версия 5.7.
И така, трябва ли да използвате MyISAM? Вероятно не. Има обаче едно предупреждение - имайте предвид, че простите COUNT(*) заявки вероятно ще се изпълняват по-бързо в MyISAM, отколкото в InnoDB - MyISAM съхранява числото в метаданните на таблицата, InnoDB не.
Използвам MyISAM и искам да премина към InnoDB, какво да правя?
Ако все още използвате MyISAM и искате да преминете към InnoDB, просто преобразувайте всичките си таблици в InnoDB. Очевидно това е по-лесно да се каже, отколкото да се направи, но ето едно просто ръководство:
- Разберете кои таблици във вашия MySQL екземпляр използват MyISAM:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ‘database_name’ AND ENGINE = ‘MyISAM’;
- Преобразувайте всичките си MyISAM таблици в InnoDB:
ALTER TABLE `table_name` ENGINE = InnoDB;
Ако не искате да изпълнявате няколко оператора ALTER TABLE един след друг, помислете за поставянето на операторите ALTER TABLE в цикъл. Това е – готово!
Резюме
MyISAM е една от най-популярните MySQL машини. Двигателят беше по подразбиране за MySQL версии до 5.5. Двигателят е един от най-популярните избори след InnoDB, но може да се нарече остарял от MySQL 8.0 - MySQL вече се е уверил, че всичко, което може да се направи с MyISAM, може да се направи и когато InnoDB се използва, така че в този момент MyISAM е почти полезен само ако искате простите COUNT(*) заявки да бъдат по-бързи. Такива заявки ще бъдат по-бързи, тъй като MyISAM съхранява числото в метаданни на таблицата - други MySQL машини не го правят.