sql >> Database >  >> RDS >> Mysql

MySQL-prestaties:MyISAM versus InnoDB

Een belangrijke factor in de databaseprestaties is de opslagengine die door de database wordt gebruikt, en meer specifiek de tabellen. Verschillende storage-engines leveren in de ene situatie betere prestaties dan in de andere. Voor algemeen gebruik zijn er twee kanshebbers om in overweging te nemen. Dit zijn MyISAM, de standaard MySQL-opslagengine, of InnoDB, een alternatieve engine die is ingebouwd in MySQL en bedoeld is voor krachtige databases. Voordat we het verschil tussen de twee opslagengines kunnen begrijpen, moeten we de term 'vergrendelen' begrijpen.

Wat vergrendelt MySQL?

Om de integriteit van de gegevens die zijn opgeslagen in databases te beschermen, maakt MySQL gebruik van vergrendeling. Vergrendelen betekent simpel gezegd het beschermen van gegevens tegen toegang. Wanneer een vergrendeling is toegepast, kunnen de gegevens niet worden gewijzigd, behalve door de query die de vergrendeling heeft geïnitieerd. Vergrendeling is een noodzakelijk onderdeel om de nauwkeurigheid van de opgeslagen informatie te waarborgen. Elke opslagengine heeft een andere vergrendelingsmethode. Afhankelijk van uw gegevens en zoekopdrachten kan de ene engine beter presteren dan de andere. In deze serie zullen we kijken naar de twee meest voorkomende soorten vergrendelingen die worden gebruikt door onze twee opslagengines.

Tafelvergrendeling: De techniek om een ​​hele tabel te vergrendelen wanneer een of meer cellen in de tabel moeten worden bijgewerkt of verwijderd. Tabelvergrendeling is de standaardmethode die wordt gebruikt door de standaardopslagengine, MyISAM.

Voorbeeld:MyISAM-tabelvergrendeling Kolom A Kolom B Kolom C
Query 1 UPDATE Rij 1 Schrijven gegevens gegevens
Query 2 SELECT (Wacht) Rij 2 gegevens gegevens gegevens
Query 3 UPDATE (Wacht) Rij 3 gegevens gegevens gegevens
Query 4 SELECT (Wacht) Rij 4 gegevens gegevens gegevens
Query 5 SELECT (Wacht) Rij 5 gegevens gegevens gegevens
Het voorbeeld illustreert hoe een enkele schrijfbewerking de hele tabel vergrendelt, waardoor andere query's wachten tot de UPDATE-query is voltooid.

Vergrendeling op rijniveau: De handeling van het vergrendelen van een effectief bereik van rijen in een tabel terwijl een of meer cellen binnen het bereik worden gewijzigd of verwijderd. Vergrendeling op rijniveau is de methode die wordt gebruikt door de InnoDB-opslagengine en is bedoeld voor krachtige databases.

Voorbeeld:InnoDB vergrendeling op rijniveau Kolom A Kolom A Kolom A
Query 1 UPDATE Rij 1 Schrijven gegevens gegevens
Query 2 SELECT Rij 2 Lezen gegevens gegevens
Query 3 UPDATE Rij 3 gegevens Schrijven gegevens
Query 4 SELECT Rij 4 Lezen Lezen Lezen
Query 5 SELECT Rij 5 Lezen gegevens Lezen
Het voorbeeld laat zien hoe met behulp van vergrendeling op rijniveau meerdere query's op afzonderlijke rijen kunnen worden uitgevoerd door alleen de rijen te vergrendelen die worden bijgewerkt in plaats van de hele tabel.

MijnISAM versus InnoDB

Door de twee opslagengines te vergelijken, komen we tot de kern van het argument tussen het gebruik van InnoDB via MyISAM. Een applicatie of website met een veelgebruikte tabel werkt uitzonderlijk goed met behulp van de InnoDB-opslagengine door knelpunten op het gebied van tafelvergrendeling op te lossen. De kwestie van het gebruik van de een boven de ander is echter subjectief, aangezien geen van beide perfect is in alle situaties. Er zijn sterke punten en beperkingen aan beide storage-engines. Een grondige kennis van de databasestructuur en querypraktijken is van cruciaal belang voor het selecteren van de beste opslagengine voor uw tabellen.

MyISAM presteert beter dan InnoDB op grote tabellen die veel meer lees- dan schrijfactiviteit vereisen. De leesbaarheid van MyISAM overtreft InnoDB omdat het vergrendelen van de hele tabel sneller is dan uitzoeken welke rijen in de tabel zijn vergrendeld. Hoe meer informatie in de tabel, hoe meer tijd InnoDB nodig heeft om erachter te komen welke niet toegankelijk zijn. Als uw toepassing afhankelijk is van enorme tabellen die niet vaak gegevens wijzigen, zal MyISAM beter presteren dan InnoDB. Omgekeerd presteert InnoDB beter dan MyISAM wanneer gegevens in de tabel regelmatig veranderen. Tabelwijzigingen schrijven gegevens meer dan gegevens lezen per seconde. In deze situaties kan InnoDB grote hoeveelheden verzoeken gemakkelijker bijhouden dan de hele tabel voor elk verzoek te vergrendelen.

Moet ik InnoDB gebruiken met WordPress, Magento of Joomla-sites?

Het korte antwoord hier is ja, in de meeste gevallen. De meest behulpzame mensen van Liquid Web bij het hosten van ondersteuningsteams zijn verschillende knelpunten tegengekomen bij het gebruik van enkele standaard webapplicaties van tegenwoordig. De meeste gebruikers van populaire applicaties van derden, zoals WordPress, Magento en Joomla, hebben beperkte kennis van de onderliggende databasecomponenten of code om een ​​weloverwogen beslissing te nemen over storage-engines. De meeste bottlenecks voor het vergrendelen van tabellen van deze contentmanagementsystemen (CMS) worden over het algemeen opgelost door alle tabellen voor de site te wijzigen in InnoDB in plaats van de standaard MyISAM. Als u veel van dit soort CMS op uw server host, zou het nuttig zijn om de standaard opslagengine in MySQL te wijzigen om InnoDB te gebruiken voor alle nieuwe tabellen, zodat alle nieuwe tafelinstallaties met InnoDB beginnen.

De standaard opslagengine instellen

Stel uw standaardopslagengine in op InnoDB door default_storage_engine=InnoDB toe te voegen naar de [mysqld] gedeelte van het systeemconfiguratiebestand op: /etc/my.cnf. Het herstarten van de MySQL-service is nodig om de server wijzigingen in het bestand te laten detecteren.

~ $ cat /etc/my.cnf
[mysqld]
log-error=/var/lib/mysql/mysql.err
innodb_file_per_table=1
default-storage-engine=innodb
innodb_buffer_pool_size=128M

Alle tabellen tussen MyISAM en InnoDB converteren

Helaas heeft MySQL van nature geen optie om tabellen te converteren, waardoor elke tabel afzonderlijk kan worden gewijzigd. Het ondersteuningsteam van Liquid Web heeft een eenvoudig te volgen onderhoudsplan voor dit proces opgesteld. Het script, dat u via shell-toegang (SSH) op de benodigde server kunt uitvoeren, converteert alle tabellen tussen opslag-engines.

OpmerkingPlan dienovereenkomstig bij het uitvoeren van dergelijke batchbewerkingen voor het geval er uitvaltijd optreedt. De beste praktijk is om een ​​back-up te maken van al uw MySQL-databases voordat u een wijziging van deze omvang implementeert. Dit biedt een eenvoudig herstelpunt om gegevensverlies te voorkomen.

Stap 1:  Voorbereiding

Plan om te beginnen op een tijdstip waarop uitvaltijd minimale gevolgen heeft. Dit proces zelf vereist geen downtime, maar downtime kan nodig zijn om te herstellen van onvoorziene omstandigheden.

Stap 2:  Maak een back-up van alle databases naar een bestand

Met de onderstaande opdracht wordt een enkele bestandsback-up gemaakt van alle databases met de naam all-databases-backup.sqld. Deze kan worden verwijderd zodra de conversie is gelukt en er geen duidelijke problemen zijn.
mysqldump --all-databases > all-databases-backup.sql

Stap 3:  Bestaande tabel-engines opnemen in een bestand

Voer het volgende script uit om de bestaande tabel-engines op te nemen in een bestand met de naam table-engine-backup.sql . U kunt dit bestand dan later "importeren" of "uitvoeren" om indien nodig terug te zetten naar hun oorspronkelijke motoren.

mysql -Bse 'SELECT CONCAT("ALTER TABLE ",table_schema,".",table_name," ENGINE=",Engine,";") FROM information_schema.tables WHERE table_schema NOT IN("mysql","information_schema","performance_schema");' | tee table-engine-backup.sql

Als u de tabel-engines om welke reden dan ook moet terugzetten, voert u:
mysql < table-engine-backup.sql uit

Stap 4a:  MijnISAM-tabellen converteren naar InnoDB

De onderstaande opdracht gaat zelfs door als een tabel faalt en laat u weten welke tabellen niet konden worden geconverteerd. De uitvoer wordt opgeslagen in het bestand met de naam convert-to-innodb.log voor latere recensiew.
mysql -Bse 'SELECT CONCAT("ALTER TABLE ",table_schema,".",table_name," ENGINE=InnoDB;") FROM information_schema.tables WHERE table_schema NOT IN ("mysql","information_schema","performance_schema") AND Engine = "MyISAM";' | while read -r i; do echo $i; mysql -e "$i"; done | tee convert-to-innodb.log

Stap 4b:converteer alle InnoDB-tabellen naar MyISAM

Deze opdracht gaat zelfs door als een tabel faalt en laat u weten welke tabellen niet konden worden geconverteerd. De uitvoer wordt ook opgeslagen in het bestand met de naam convert-to-myisam.log voor latere beoordeling.

mysql -Bse 'SELECT CONCAT("ALTER TABLE ",table_schema,".",table_name," ENGINE=MyISAM;") FROM information_schema.tables WHERE table_schema NOT IN ("mysql","information_schema","performance_schema") AND Engine = "InnoDB";' | while read -r i; do echo $i; mysql -e "$i"; done | tee convert-to-myisam.log

Een enkele tabel converteren tussen MyISAM en InnoDB

De volgende commando's laten zien hoe het converteren van een enkele tabel wordt bereikt.

Opmerking Vervang databasenaam door de juiste databasenaam en tabelnaam door de juiste tabelnaam. Zorg ervoor dat u een geldige back-up van de betreffende tabel hebt voordat u doorgaat.

Maak een back-up van een enkele tabel naar een bestand
mysqldump database_name table_name > backup-table_name.sql

Een enkele tabel converteren naar InnoDB

mysql -Bse ‘ALTER TABLE database_name.table_name ENGINE=InnoDB;’

Een enkele tabel converteren naar MyISAM:

mysql -Bse ‘ALTER TABLE database_name.table_name ENGINE=MyISAM;’

Bekijk onze andere artikelen in deze serie, MySQL-prestaties:het identificeren van lange zoekopdrachten, om langzame zoekopdrachten in uw database te lokaliseren. Houd ons in de gaten voor ons volgende artikel waarin we caching en optimalisatie bespreken.

Serienavigatie<>

  1. Rails:implementatie naar Heroku, veel problemen

  2. PostgreSQL volgende waarde van de reeksen?

  3. Volgsignalen met een signaalverwerkingsgegevensmodel

  4. Hoe een bestaande Postgres-tabel zo transparant mogelijk naar een gepartitioneerde tabel migreren?