sql >> Database teknologi >  >> RDS >> Mysql

Forbedring af MySQL-ydeevne med avancerede InnoDB-indstillinger

Vi har diskuteret, hvordan man konfigurerer InnoDB til høj ydeevne for et stykke tid siden, men vi har endnu ikke diskuteret, hvordan vi kan forbedre MySQL-ydeevnen, mens vi gør brug af avancerede InnoDB-indstillinger. Dette blogindlæg skulle give lidt mere indsigt i dette emne.

InnoDB forklaret

Før vi rent faktisk dykker dybere ned i InnoDB-indstillinger, bør vi nok forstå det grundlæggende:InnoDB er en lagermaskine til MySQL, MariaDB og Percona Server. Motoren var kendt som InnoDB Plugin, hvilket kræver opsætning og installation af plugion. Indtil udgivelsen af ​​MySQL 5.5.5 er InnoDB ikke længere et plugin og er nu en del af MySQL-pakken som en af ​​de understøttede lagringsmotorer til MySQL. Siden udgivelsen af ​​MySQL 5.6 er InnoDB blevet standardlagringsmotoren - det er en generel storage-motor, der balancerer høj pålidelighed og høj ydeevne. De vigtigste fordele ved InnoDB inkluderer understøttelse af rækkeniveaulåsning, fremmednøgler og at følge ACID-modellen (Atomicity Consistency Isolation Durability) - ACID er et sæt egenskaber, der er beregnet til at garantere datavaliditet på trods af fejl, strømsvigt og andre problemer. InnoDB har en omfattende liste over variabler, og nogle af disse hjælper med at forbedre ydeevnen, især på typen af ​​hardware og tilgængelige ressourcer på din databaseserver. Blandt disse er:

  • innodb_data_file_path er filen, hvor data fra InnoDB-tabeller er gemt.
  • innodb_buffer_pool_size er en hukommelsesbuffer, som InnoDB bruger til at cache data og indekser af sine tabeller.
  • innodb_log_file_size viser størrelsen af ​​InnoDB-logfiler. Jo større innodb_log_file_size er, jo længere er restitutionstid du har brug for i tilfælde af et nedbrud.
  • innodb_log_buffer_size bruges af InnoDB til at skrive til logfilerne på disken.
  • innodb_flush_log_at_trx_commit kontrollerer balancen mellem ydeevne og ACID-overholdelse. Standardværdien er 1, hvilket hjælper med at holde InnoDB ACID-kompatibel - hvis du drejer innodb_flush_log_at_trx_commit til 2, får du en meget hurtig skrivehastighed, men op til et sekunds transaktioner kan gå tabt.

Der er også avancerede InnoDB-indstillinger, der kan indstilles til at forbedre MySQL-ydeevnen yderligere. Vi vil tage et kig på dem nu.

Avancerede InnoDB-indstillinger

Som allerede nævnt ovenfor, har InnoDB avancerede indstillinger, der kan bruges til yderligere at forbedre ydeevnen af ​​det (vi vil ikke vise dem absolut alle, men indstillingerne, der er angivet, burde give dig en ret god idé om, hvor kraftfuld InnoDB egentlig er):

  • InnoDB kan deaktiveres - hvis du vil deaktivere InnoDB, skal du blot ændre filen my.cnf og tilføje skip-innodb under [mysqld] sektionen. Genstart derefter din MySQL-server - InnoDB skulle nu være deaktiveret. Alternativt kan du gøre brug af --innodb-indstillingen:at sætte den til OFF deaktiverer motoren. Bemærk dog, at disse muligheder er forældede fra og med MySQL 5.7.5.
  • InnoDB giver også en konfigurerbar låsemekanisme, der kan forbedre ydeevnen af ​​SQL-sætninger, der tilføjer rækker til tabeller med AUTO_INCREMENT-kolonner:auto-increment-tilstande kan konfigureres ved opstart ved at bruge indstillingen innodb_autoinc_lock_mode. Indstillingen har tre indstillinger til at specificere låsetilstanden - låsetilstanden kan være 0 ("traditionel"), 1 ("konsekutiv") eller 2 ("sammenflettet"). Værdier tilbyder ydeevne afhængigt af typen af ​​databaseindsættelse. Kort sagt tilbyder 0 kompatibilitet med ældre versioner af MySQL og Innodb. Værdien 1 giver mere sikkerhed og deterministisk tilgang til sætningsbaseret replikering (SBR). Mens værdien 2 har den mere skalerbare og hurtigste låsetilstand, men rækker indsat af en given sætning er muligvis ikke fortløbende. Se MySQL-dokumentationen for mere information.
  • InnoDB giver dig mulighed for at opdele bufferpuljen i flere segmenter (funktionen er kun tilgængelig fra MySQL 5.5) - indstillingen innodb_buffer_pool_instances giver dig mulighed for at forbedre MySQLs skalerbarhed på maskiner, der kører flere kerner. Som standard er værdien af ​​denne indstilling 1, hvis innodb_buffer_pool_size er mindre end 1 GB og 8 ellers:tallet angiver antallet af regioner, som InnoDB bufferpuljen er opdelt i. Denne indstilling kan bruges til at engagere flere kerner, vi vil forklare hvordan senere.
  • InnoDB tilbyder fire transaktionsisolationsniveauer (tx_isolation i <5.7, men transaktionsisolation i version 5.7 og frem):LÆS UNCOMMITTED, LÆS KOMMITTET, LÆS KOMMITTERET, GENTAGLIG LÆS og SERIALISERBAR:Disse isolationsniveauer er "I" i ACID akronymet :
    • Når READ UNCOMMITTED er i brug, kan en transaktion se ikke-forpligtede ændringer af en anden transaktion. Dette isolationsniveau tillader beskidte læsninger.
    • Når READ COMMITTED er i brug, kan du være sikker på, at alle data, der blev læst, blev begået i det øjeblik, de blev læst.
    • Når REPEATABLE READ er i brug, er et højere isolationsniveau i brug. Ud over alt, hvad der er garanteret af READ COMMITTED-niveauet, garanterer det også, at data, der allerede er blevet læst, ikke kan ændres.
    • Når SERIALIZABLE er i brug, er et endnu højere isolationsniveau i brug. Ud over alt det, der er garanteret af isolationsniveauet REPEATABLE READ, garanterer det også, at ingen nye data kan ses ved efterfølgende læsninger.
  • InnoDB giver dig også mulighed for at definere den overordnede I/O-kapacitet, der er tilgængelig for InnoDB, ved at ændre variabelen innodb_io_capacity. Værdien af ​​denne variabel bør indstilles til omtrent det antal IOPS, som systemet kan udføre pr. sekund:Når du indstiller værdien af ​​denne parameter, skal du huske, at værdier omkring 100 er mere passende for HDD'er, mens SSD'er kan drage fordel af højere værdier . Variablen innodb_io_capacity_max kan også være til hjælp:denne variabel gør det muligt for InnoDB at skylle mere aggressivt, hvilket betyder, at hastigheden af ​​I/O-operationer kan overskride grænsen defineret af innodb_io_capacity - i sådanne situationer vil operationer ikke overstige værdien defineret af variabelen innodb_io_capacity_max .
  • InnoDB giver dig også mulighed for at kontrollere, hvor mange baggrundstråde der er tilgængelige for I/O-operationer:antallet af I/O-tråde, der er allokeret til læseoperationer, kan styres af variabelen innodb_read_io_threads, mens antallet af I/ O-tråde allokeret til skriveoperationer kan styres af variabelen innodb_write_io_threads. Standardværdien for begge disse parametre er 4, og den maksimalt tilladte værdi er 64.
  • InnoDB har evnen til at omdanne visse InnoDB-advarsler til fejl:for at gøre det skal du blot sætte variablen innodb_strict_mode til ON:denne variabel påvirker håndteringen af ​​syntaksfejl for CREATE TABLE, ALTER TABLE og CREATE INDEX operationer :Deaktivering af denne variabel kan muligvis løse "Rækkestørrelse for stor" fejl. For at deaktivere streng tilstand skal du indstille innodb_strict_mode til FRA.
  • InnoDB kan i nogen grad beskyttes mod fuld tabelscanninger, der forstyrrer data, der er gemt i bufferpuljen, ved at øge variabelen innodb_old_blocks_time. Minimumsværdien for denne indstilling er 0, standardværdien er 1000.
  • Hvis du kører vedligeholdelsesoperationer på InnoDB-tabeller, der indeholder FULLTEXT-indekser, kan du overveje at slå variabelen innodb_optimize_fulltext_only til TIL - efter at denne variabel er aktiveret, bør OPTIMIZE TABLE-forespørgslen køre hurtigere, fordi den vil springe omorganiseringen af ​​data over i bordet. Bemærk, at denne indstilling kun skal aktiveres midlertidigt, så det kan være en god idé at slå den fra, når optimeringen er afsluttet.
  • For at starte InnoDB i skrivebeskyttet tilstand skal du aktivere indstillingen innodb_read_only. Når denne indstilling er aktiveret, kan du forespørge på InnoDB-tabeller, hvor MySQL-databiblioteket er på skrivebeskyttede medier.

At få InnoDB til at engagere flere kerner

Du kan også få InnoDB til at engagere flere kerner ved at drage fordel af dens multithreading-funktioner:overraskende nok er dette ikke særlig svært at opnå - du skal bare ændre et par indstillinger. Sådan gør du det:

  1. Lad indodb_thread_concurrency-indstillingen stå på dens standardværdi 0. Ved at gøre det lader du InnoDB bestemme det bedste antal samtidighedsbilletter (de bestemmer antallet af tråde, der samtidigt kan komme ind i InnoDB) for at åbne for en given MySQL instans opsætning. For MariaDB, der starter 10.5, er det markeret som forældet, så det ville give mening for MySQL at sætte dette til 0, da computerressourcer er blevet sofistikerede sammenlignet med de tidlige dage af MySQL.
  2. Når indstillingen innodb_thread_concurrency er indstillet til 0, skal du indstille både innodb_read_io_threads og innodb_write_io_threads til deres maksimale værdier på 64. Dette burde engagere flere kerner.

Oversigt

For at opsummere er InnoDB en ekstremt kraftfuld lagermotor. Ydeevnen af ​​denne lagermotor påvirkes direkte af de indstillinger, som denne motor bruger. Så hvis du vil forbedre ydeevnen af ​​din MySQL-instans, skal du huske på i det mindste et par af de tips, der er nævnt i denne artikel. At justere indstillingerne vedrørende motoren og bruge dem, når det er relevant, bør give dig en fordel.


  1. sql-server ugyldigt objektnavn - men tabeller er opført i SSMS-tabeller

  2. NULL vs. 'uendeligt' i PostgreSQL-områdetyper

  3. I stedet for trigger i SQL Server mister SCOPE_IDENTITY?

  4. Kopier tabeller fra en database til en anden i SQL Server