Vi har diskuterat hur man konfigurerar InnoDB för hög prestanda för ett tag sedan, men vi har ännu inte diskuterat hur vi kan förbättra MySQL-prestanda samtidigt som vi använder avancerade InnoDB-inställningar. Det här blogginlägget borde ge lite mer insikt i detta ämne.
InnoDB Explained
Innan vi faktiskt dyker djupare in i InnoDB-inställningarna borde vi förmodligen förstå grunderna:InnoDB är en lagringsmotor för MySQL, MariaDB och Percona Server. Motorn var känd som InnoDB Plugin, vilket kräver installation och installation av plugin. Fram till lanseringen av MySQL 5.5.5 är InnoDB inte längre ett plugin och är nu en del av MySQL-paketet som en av de stödda lagringsmotorerna för MySQL. Sedan MySQL 5.6 lanserades har InnoDB blivit standardlagringsmotorn – det är en allmän lagringsmotor som balanserar hög tillförlitlighet och hög prestanda. De viktigaste fördelarna med InnoDB inkluderar stöd för låsning på radnivå, främmande nycklar och att följa modellen ACID (Atomicity Consistency Isolation Durability) - ACID är en uppsättning egenskaper som är avsedda att garantera datavaliditet trots fel, strömavbrott och andra problem. InnoDB har en omfattande lista med variabler och några av dessa hjälper till att förbättra prestandan, särskilt på typen av hårdvara och tillgängliga resurser på din databasserver. Bland dessa är:
- innodb_data_file_path är filen där data från InnoDB-tabeller lagras.
- innodb_buffer_pool_size är en minnesbuffert som InnoDB använder för att cachelagra data och index för sina tabeller.
- innodb_log_file_size visar storleken på InnoDB-loggfiler. Ju större innodb_log_file_size är, desto längre återställningstid behöver du i händelse av en krasch.
- innodb_log_buffer_size används av InnoDB för att skriva till loggfilerna på disken.
- innodb_flush_log_at_trx_commit kontrollerar balansen mellan prestanda och ACID-efterlevnad. Standardvärdet är 1, vilket hjälper till att hålla InnoDB ACID-kompatibel – om du vrider innodb_flush_log_at_trx_commit till 2 får du en mycket snabb skrivhastighet, men upp till en sekunds transaktioner kan gå förlorade.
Det finns också avancerade InnoDB-inställningar som kan ställas in för att förbättra MySQL-prestandan ytterligare. Vi ska ta en titt på dem nu.
Avancerade InnoDB-inställningar
Som redan nämnts ovan har InnoDB avancerade inställningar som kan användas för att ytterligare förbättra prestandan för den (vi kommer inte att lista absolut alla, men inställningarna som är listade bör ge dig en ganska bra idé om hur kraftfull InnoDB verkligen är):
- InnoDB kan inaktiveras - om du vill inaktivera InnoDB, ändra helt enkelt filen my.cnf och lägg till skip-innodb under [mysqld]-sektionen. Efter det, starta om din MySQL-server - InnoDB bör nu vara inaktiverad. Alternativt kan du använda alternativet --innodb:om du ställer in det på OFF inaktiverar du motorn. Observera dock att dessa alternativ är utfasade från och med MySQL 5.7.5.
- InnoDB tillhandahåller också en konfigurerbar låsmekanism som kan förbättra prestandan för SQL-satser som lägger till rader i tabeller med AUTO_INCREMENT-kolumner:auto-increment-lägen kan konfigureras vid start genom att använda alternativet innodb_autoinc_lock_mode. Alternativet har tre inställningar för att specificera låsläget - låsläget kan vara 0 ("traditionell"), 1 ("konsekutiv") eller 2 ("interfolierad"). Värden erbjuder prestanda beroende på typen av databasinfogning. Kort sagt, 0 erbjuder kompatibilitet med äldre versioner av MySQL och Innodb. Värdet 1 erbjuder mer säkerhet och deterministisk metod för uttalandebaserad replikering (SBR). Medan värdet 2 har det mer skalbara och snabbaste låsläget, men rader som infogats av en given sats kanske inte är på varandra. Se MySQL-dokumentationen för mer information.
- InnoDB ger dig möjligheten att dela upp buffertpoolen i flera segment (funktionen är endast tillgänglig från MySQL 5.5) - inställningen innodb_buffer_pool_instances gör att du kan förbättra MySQL:s skalbarhet på maskiner som kör flera kärnor. Som standard är värdet för den här inställningen 1 om innodb_buffer_pool_size är mindre än 1 GB och 8 annars:siffran anger antalet regioner som InnoDB-buffertpoolen är indelad i. Den här inställningen kan användas för att engagera fler kärnor, vi kommer att förklara hur senare.
- InnoDB erbjuder fyra transaktionsisoleringsnivåer (tx_isolation i <5.7 men transaktionsisolation i version 5.7 och framåt):LÄS UNCOMMITTED, READ COMMITTED, REPEATEBLE READ och SERIALIZABLE:dessa isoleringsnivåer är "I" i ACID-akronymen :
- När READ UNCOMMITTED används kan en transaktion se oengagerade ändringar av en annan transaktion. Denna isoleringsnivå tillåter smutsavläsning.
- När READ COMMITTED används kan du vara säker på att all data som lästes begicks i det ögonblick de lästes.
- När REPEATABLE READ används, används en högre isoleringsnivå. Utöver allt som garanteras av nivån READ COMMITTED, garanterar den också att all data som redan har lästs inte kan ändras.
- När SERIALIZABLE används, används en ännu högre isoleringsnivå. Utöver allt som garanteras av isoleringsnivån REPEATABLE READ, garanterar den också att inga nya data kan ses vid efterföljande läsningar.
- InnoDB låter dig också definiera den övergripande I/O-kapaciteten som är tillgänglig för InnoDB genom att modifiera variabeln innodb_io_capacity. Värdet på denna variabel bör ställas in på ungefär det antal IOPS som systemet kan utföra per sekund:när du ställer in värdet för denna parameter, kom ihåg att värden runt 100 är mer lämpliga för hårddiskar, medan SSD:er kan dra nytta av högre värden . Variabeln innodb_io_capacity_max kan också vara till hjälp:denna variabel tillåter InnoDB att spola mer aggressivt, vilket innebär att hastigheten för I/O-operationer kan överskrida gränsen som definieras av innodb_io_capacity - i sådana situationer kommer operationer inte att överskrida värdet som definieras av variabeln innodb_io_capacity_max .
- InnoDB låter dig också styra hur många bakgrundstrådar som är tillgängliga för I/O-operationer:antalet I/O-trådar som allokeras till läsoperationer kan styras av variabeln innodb_read_io_threads medan antalet I/ O-trådar som allokerats till skrivoperationer kan styras av variabeln innodb_write_io_threads. Standardvärdet för båda dessa parametrar är 4 och det högsta tillåtna värdet är 64.
- InnoDB har förmågan att förvandla vissa InnoDB-varningar till fel:för att göra det ställer du bara in variabeln innodb_strict_mode till ON:denna variabel påverkar hanteringen av syntaxfel för CREATE TABLE, ALTER TABLE och CREATE INDEX operationer :Om du inaktiverar den här variabeln kan felen "Radstorlek för stor" lösas. För att inaktivera strikt läge, ställ innodb_strict_mode på AV.
- InnoDB kan skyddas något mot genomsökningar av hela tabeller som stör data som lagras i buffertpoolen genom att öka variabeln innodb_old_blocks_time. Minimivärdet för denna inställning är 0, standardvärdet är 1000.
- Om du kör underhållsoperationer på InnoDB-tabeller som innehåller FULLTEXT-index kan du överväga att aktivera variabeln innodb_optimize_fulltext_only - efter att denna variabel har aktiverats bör OPTIMIZE TABLE-frågan köras snabbare eftersom den hoppar över omorganiseringen av data i bordet. Observera att den här inställningen endast är avsedd att aktiveras tillfälligt så du kanske vill stänga av den när optimeringen är klar.
- För att starta InnoDB i skrivskyddat läge, aktivera inställningen innodb_read_only. När den här inställningen är aktiverad kan du fråga efter InnoDB-tabeller där MySQL-datakatalogen finns på skrivskyddad media.
Att få InnoDB att engagera fler kärnor
Du kan också få InnoDB att engagera fler kärnor genom att dra fördel av dess multitrådsfunktioner:överraskande nog är detta inte särskilt svårt att uppnå - du behöver bara ändra ett par inställningar. Så här gör du det:
- Lämna alternativet innodb_thread_concurrency på dess standardvärde 0. Genom att göra det låter du InnoDB bestämma det bästa antalet samtidiga biljetter (de bestämmer antalet trådar som samtidigt kan komma in i InnoDB) som ska öppnas för en given MySQL instansinställningar. För MariaDB som börjar 10.5 markeras den som utfasad, så det skulle vara vettigt för MySQL att ställa in detta till 0 eftersom datorresurser har varit sofistikerade jämfört med MySQLs tidiga dagar.
- När alternativet innodb_thread_concurrency är inställt på 0, ställ in både innodb_read_io_threads och innodb_write_io_threads till sina maximala värden på 64. Detta bör engagera fler kärnor.
Sammanfattning
För att sammanfatta, är InnoDB en extremt kraftfull lagringsmotor. Prestandan för denna lagringsmotor påverkas direkt av inställningarna som denna motor använder. Så om du vill förbättra prestandan för din MySQL-instans, se till att ha i åtanke åtminstone några av tipsen som nämns i den här artikeln. Att justera inställningarna för motorn och använda dem när så är lämpligt bör ge dig en fördel.