MyISAM är en av de mest populära lagringsmotorerna i MySQL. MyISAM är ofta det andra valet efter InnoDB - i det här blogginlägget kommer vi att försöka ta reda på hur man bäst arbetar med denna motor.
Vad är MyISAM?
MyISAM är en av MySQL:s lagringsmotorer. MyISAM är baserat på ISAM (Indexed Sequential Access Method), en indexeringsalgoritm utvecklad av IBM som gör det möjligt att snabbt hämta information från stora uppsättningar data. Den klarar sig dock inte så bra när den samtidigt läser från och skriver till ett bord, på grund av dess bordlåsning. Det stöder inte heller transaktioner.
För vissa MySQL-ingenjörer är denna motor det mest populära valet efter InnoDB:MyISAM-lagringsmotorn var den enda lagringsmotorn som MySQL tillhandahåller 2005 och var tillgänglig att använda i mer än 20 år. MyISAM var standardlagringsmotorn för MySQL upp till version 5.5.
MyISAM från insidan
En illustration av hur MyISAM fungerar från insidan ligger inte inom ramen för denna blogg, men vi kan ge dig inställningar som hjälper dig att optimera motorns prestanda:
- Myisam_sort_buffer_size definierar bufferten som tilldelas när indexet sorteras genom att köra REPAIR-, CREATE INDEX- eller ALTER TABLE-frågor.
- Key_buffer_size definierar storleken på bufferten som används för indexblock över MyISAM-tabeller. Att öka denna parameter kan leda till bättre indexhantering.
- Sort_buffer_size beskriver storleken på en buffert som är tilldelad för trådar som behöver utföra sorteringsoperationer.
- Read_buffer_size beskriver storleken på en buffert som är tilldelad för trådar som utför sekventiella skanningsoperationer.
- Write_buffer_size beskriver storleken på skrivbufferten.
Dessa fyra parametrar är viktiga, men även om de är viktiga bör du också hålla ett öga på variabeln key_buffer_size. Variabeln key_buffer_size bestämmer storleken på de indexbuffertar som finns i minnet - tänk på den som motsvarigheten innodb_buffer_pool_size, men för MyISAM. Om dina servrar huvudsakligen består av MyISAM-tabeller kan du allokera cirka 25 % eller mer av det tillgängliga RAM-minnet på servern till variabeln key_buffer_size. Det finns också ett annat sätt att bestämma vad värdet på parametern key_buffer_size ska vara - jämför helt enkelt värdet key_read_requests (totalt värde av förfrågningar att läsa ett index) och key_reads-värdet (värdet av key_reads är antalet förfrågningar som måste göras läsa från disk). Värdena för dessa parametrar kan hämtas genom att titta på serverns statusvariabler (ställ helt enkelt en SHOW GLOBAL STATUS-fråga på din MySQL-server). Det är också fördelaktigt att komma ihåg att om key_reads returnerar ett stort värde är värdet på key_buffer_size förmodligen för litet.
MyISAM och MySQL 8.0
Om du frågar några MySQL-ingenjörer kommer de att säga att MyISAM inte längre ska användas. Varför? Tja, vissa människor säger att på grund av det faktum att när MySQL avancerade lade de till majoriteten av funktionerna som tidigare bara kunde ses i MyISAM till InnoDB, vilket effektivt gjorde MyISAM föråldrat:
- Fulltextindex har varit tillgängliga i InnoDB sedan version 5.6.
- Bärbara tabellutrymmen blev tillgängliga i InnoDB sedan version 5.6.
- Spatiala index blev tillgängliga i InnoDB sedan version 5.7.
- Senaste uppdateringen för tabellen blev tillgänglig i InnoDB sedan version 5.7.
Så, ska du fortfarande använda MyISAM? Antagligen inte. Det finns dock en varning - tänk på att enkla COUNT(*) frågor förmodligen kommer att fungera snabbare på MyISAM än på InnoDB - MyISAM lagrar numret i tabellens metadata, det gör inte InnoDB.
Jag använder MyISAM och vill byta till InnoDB, vad gör jag?
Om du fortfarande använder MyISAM och vill byta till InnoDB, konvertera helt enkelt alla dina tabeller till InnoDB. Uppenbarligen är det lättare sagt än gjort, men här är en enkel guide:
- Ta reda på vilka tabeller i din MySQL-instans som använder MyISAM:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ‘database_name’ AND ENGINE = ‘MyISAM’;
- Konvertera alla dina MyISAM-tabeller till InnoDB:
ALTER TABLE `table_name` ENGINE = InnoDB;
Om du inte vill köra flera ALTER TABLE-satser efter varandra, överväg att lägga ALTER TABLE-satserna i en loop. Det är allt - du är klar!
Sammanfattning
MyISAM är en av de mest populära MySQL-motorerna. Motorn var standard för MySQL-versioner upp till 5.5. Motorn är ett av de mest populära valen efter InnoDB, men den kan kallas föråldrad från och med MySQL 8.0 - MySQL har redan sett till att allt som kan göras med MyISAM också kan göras när InnoDB används, så vid det här laget MyISAM är i stort sett bara användbart om du vill att enkla COUNT(*)-frågor ska vara snabbare. Sådana frågor kommer att gå snabbare eftersom MyISAM lagrar numret i tabellmetadata – andra MySQL-motorer gör det inte.