sql >> Database >  >> RDS >> Mysql

Werken met MyISAM in MySQL

MyISAM is een van de meest populaire opslagengines in MySQL. MyISAM is vaak de tweede keuze na InnoDB - in deze blogpost zullen we proberen uit te vinden hoe we het beste met deze engine kunnen werken.

Wat is MijnISAM?

MyISAM is een van de opslagengines van MySQL. MyISAM is gebaseerd op ISAM (Indexed Sequential Access Method), een door IBM ontwikkeld indexeringsalgoritme waarmee op een snelle manier informatie uit grote hoeveelheden gegevens kan worden opgehaald. Het doet het echter niet zo goed bij het gelijktijdig lezen van en schrijven naar één tabel, vanwege de tafelvergrendeling. Het ondersteunt ook geen transacties.

Voor sommige MySQL-ingenieurs is deze engine de meest populaire keuze na InnoDB:de MyISAM-opslagengine was de enige opslagengine die in 2005 door MySQL werd geleverd en was meer dan 20 jaar beschikbaar voor gebruik. MyISAM was de standaard opslagengine voor MySQL tot versie 5.5.

MijnISAM van binnenuit

Een illustratie van hoe MyISAM van binnenuit werkt, valt niet binnen het bestek van deze blog, maar we kunnen u de instellingen geven die u helpen de prestaties van de engine te optimaliseren:

  • Myisam_sort_buffer_size definieert de buffer die wordt toegewezen wanneer de index wordt gesorteerd door REPAIR-, CREATE INDEX- of ALTER TABLE-query's uit te voeren.
  • Key_buffer_size definieert de grootte van de buffer die wordt gebruikt voor indexblokken in MyISAM-tabellen. Het verhogen van deze parameter kan leiden tot een betere verwerking van de index.
  • Sort_buffer_size beschrijft de grootte van een buffer die is toegewezen aan threads die sorteerbewerkingen moeten uitvoeren.
  • Read_buffer_size beschrijft de grootte van een buffer die is toegewezen aan threads die opeenvolgende scanbewerkingen uitvoeren.
  • Write_buffer_size beschrijft de grootte van de schrijfbuffer.

Deze vier parameters zijn belangrijk, maar hoewel ze belangrijk zijn, moet je ook de key_buffer_size variabele in de gaten houden. De variabele key_buffer_size bepaalt de grootte van de indexbuffers die in het geheugen worden bewaard - beschouw het als de tegenhanger van innodb_buffer_pool_size, maar dan voor MyISAM. Als uw servers voornamelijk uit MyISAM-tabellen bestaan, kunt u ongeveer 25% of meer van het beschikbare RAM-geheugen op de server toewijzen aan de variabele key_buffer_size. Er is ook een andere manier om te bepalen wat de waarde van de key_buffer_size parameter zou moeten zijn - vergelijk eenvoudig de key_read_requests waarde (totale waarde van verzoeken om een ​​index te lezen) en de key_reads waarde (de waarde van key_reads is het aantal verzoeken dat moest worden lezen van schijf). De waarden voor die parameters kunnen worden opgehaald door naar de serverstatusvariabelen te kijken (geef eenvoudigweg een SHOW GLOBAL STATUS-query op uw MySQL-server). Het is ook nuttig om te onthouden dat als key_reads een grote waarde retourneert, de waarde van key_buffer_size waarschijnlijk te klein is.

MyISAM en MySQL 8.0

Als je het aan sommige MySQL-engineers vraagt, zullen ze zeggen dat MyISAM niet langer gebruikt mag worden. Waarom? Welnu, sommige mensen zeggen dat vanwege het feit dat toen MySQL vooruitging, ze de meeste functies die voorheen alleen in MyISAM te zien waren, in InnoDB hebben toegevoegd, waardoor MyISAM achterhaald is geworden:

  • Full-text indexen zijn sinds versie 5.6 beschikbaar in InnoDB.
  • Draagbare tabelruimten zijn sinds versie 5.6 beschikbaar in InnoDB.
  • Ruimtelijke indexen zijn sinds versie 5.7 beschikbaar in InnoDB.
  • Laatste update voor tabel kwam beschikbaar in InnoDB sinds versie 5.7.

Dus, moet je nog steeds MyISAM gebruiken? Waarschijnlijk niet. Er is echter één kanttekening:houd er rekening mee dat eenvoudige COUNT(*)-query's waarschijnlijk sneller zullen presteren op MyISAM dan op InnoDB. MyISAM slaat het nummer op in de metagegevens van de tabel, InnoDB niet.

Ik gebruik MyISAM en wil overstappen naar InnoDB, wat moet ik doen?

Als u MyISAM nog steeds gebruikt en wilt overschakelen naar InnoDB, converteert u eenvoudig al uw tabellen naar InnoDB. Dat is natuurlijk makkelijker gezegd dan gedaan, maar hier is een eenvoudige gids:

  1. Zoek uit welke tabellen in uw MySQL-instantie MyISAM gebruiken:
    SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ‘database_name’ AND ENGINE = ‘MyISAM’;
  2. Converteer al uw MyISAM-tabellen naar InnoDB:
    ALTER TABLE `table_name` ENGINE = InnoDB;

Als je niet meerdere ALTER TABLE-instructies achter elkaar wilt uitvoeren, overweeg dan om de ALTER TABLE-instructies in een lus te plaatsen. Dat is alles - u bent klaar!

Samenvatting

MyISAM is een van de meest populaire MySQL-engines. De engine was de standaard voor MySQL-versies tot 5.5. De engine is een van de meest populaire keuzes na InnoDB, maar kan vanaf MySQL 8.0 achterhaald worden genoemd - MySQL heeft er al voor gezorgd dat alles wat met MyISAM kan worden gedaan ook kan worden gedaan wanneer InnoDB in gebruik is, dus op dit moment MyISAM is vrijwel alleen nuttig als u wilt dat eenvoudige COUNT(*)-query's sneller zijn. Dergelijke zoekopdrachten zullen sneller zijn omdat MyISAM het nummer opslaat in tabelmetadata - andere MySQL-engines niet.


  1. Enkele quote, dubbele quote en backticks in MySQL-query's

  2. Android:SQLite-database openen en sluiten

  3. Dapper gebruiken met Oracle-opgeslagen procedures die cursors retourneren

  4. Hoe associatieve arrays in Oracle Database te maken