sql >> Databasteknik >  >> RDS >> Mysql

MySQL-optimerande INSERT-hastighet saktas ner på grund av index

Om du vill ha snabba insatser är det första du behöver ordentlig hårdvara. Det förutsätter tillräcklig mängd RAM, en SSD istället för mekaniska enheter och ganska kraftfull CPU.

Eftersom du använder InnoDB vill du optimera den eftersom standardkonfigurationen är designad för långsamma och gamla maskiner.

Här är en bra läsning om hur du konfigurerar InnoDB

Efter det behöver du veta en sak – och det är hur databaser gör sina grejer internt, hur hårddiskar fungerar och så vidare. Jag kommer att förenkla mekanismen i följande beskrivning:

En transaktion är MySQL som väntar på att hårddisken ska bekräfta att den skrev data. Det är därför transaktioner är långsamma på mekaniska enheter, de kan göra 200-400 input-out-operationer per sekund. Översatt betyder det att du kan få 200ish infogningsfrågor per sekund med InnoDB på en mekanisk enhet. Naturligtvis är det här en förenklad förklaring , bara för att beskriva vad som händer, det är inte hela mekanismen bakom transaktionen .

Eftersom en fråga, särskilt den som motsvarar storleken på din tabell, är relativt liten i termer av byte - slösar du i praktiken bort värdefull IOPS på en enda fråga.

Om du slår in flera frågor (100 eller 200 eller fler, det finns inget exakt antal, du måste testa) i en enda transaktion och sedan utför den - du kommer omedelbart att få fler skrivningar per sekund.

Percona-killar uppnår 15 000 skär i sekunden på en relativt billig hårdvara. Även 5k-inlägg per sekund är inte dåligt. Tabellen som din är liten, jag har gjort tester på en liknande tabell (3 kolumner till) och jag lyckades komma till 1 miljard poster utan märkbara problem, med hjälp av 16gb ram-maskin med en 240GB SSD (1 enhet, ingen RAID, används för teständamål).

TL;DR:- följ länken ovan, konfigurera din server, skaffa en SSD, slå in flera inlägg i 1 transaktioner och vinst. Och stäng inte av och sedan på indexering, det är inte alltid tillämpligt, för någon gång kommer du att lägga bearbetning och IO-tid på att bygga dem.



  1. Hur deklarerar man indata-utgångsparametrar i lagrad procedur/funktion i SQL Server?

  2. Hitta skillnaden mellan den senaste och den näst senaste terminen

  3. Android :Fel vid kopiering av databas (Sqliite) från tillgångsmapp

  4. WHERE-satsen körs bättre före IN och JOIN eller efter