sql >> Databasteknik >  >> RDS >> Mysql

Det går långsamt att uppdatera med `database/sql` i Go

(Att tala ur MySQL-synpunkt...)

Några "tumregler":

  • Enstaka INSERT :10 ms
  • 100 eller fler rader infogade av en enda INSERT :10 gånger så snabbt per rad.
  • BEGIN; INSERT...; INSERT...; ... COMMIT; :Även 10x.
  • Ovanstående förutsätter hårddisk; SSD kan vara ytterligare 10 gånger snabbare.
  • Om flera anslutningar var och en gör infogning, kan de kunna köra parallellt. 10 trådar kanske kan göra 5 gånger arbetet under samma förflutna tid. (Detta kan såklart lägga till oönskad komplexitet till appen.)

Liknande siffror för UPDATE , även om det inte är lätt att göra olika uppdateringar på olika rader med en enda fråga.

Ditt test visar 8,5 ms per rad UPDATEd när du gör en rad i taget. Batchar antingen med BEGIN...COMMIT kommer förmodligen att ta cirka 85 ms för alla 100 rader, även på hårddisken.

Vissa applikationer lämpar sig för batchning; vissa gör det inte. Om du vill prata om att förbättra MySQL-prestanda måste vi gå in på detaljerna i din ansökan.

"Gilla"- och "Visa"-räknare kan måste flyttas till ett "parallellt" bord eftersom de tenderar att uppdateras en i taget, med viss störning av annan aktivitet. De tenderar också att automatiskt tillåta flertrådning, alltså mycket mindre än 850 ms per 100. Vid riktigt hög aktivitet (över till exempel 1K visningar per sekund) kan sådana räknare artificiellt batchas via extra appkod.

Vänligen skriv om ditt riktmärke för att återspegla aktiviteten som kommer att hända i den verkliga applikationen. (Jag gissar att uppdateringarna kommer att ske parallellt, inte seriella. Och de kommer att spridas slumpmässigt över tiden.)

En annan sak... Om varje "visningsantal" kommer till en webbserver, så finns det också att ansluta och koppla bort; därav det förflutna tiden är sannolikt mer än 8,5 ms. Men "förfluten" är inte den kritiska frågan; den verkliga frågan är "hur många uppdateringar kan utföras per sekund".)

Och en annan sak... Om du testar "parallellt", slå inte samma rad vid varje begäran. Det kommer förmodligen att gå mycket långsammare än om du träffar olika rader. (Att slå en slumpmässig rad skulle vara bättre. Att ha en fördom i vilken rad man ska träffa skulle vara ännu mer realistiskt.)




  1. Använder setDate i PreparedStatement

  2. CodeIgniter-konfigurationsteckenuppsättning och UTF-8-stöd

  3. Spark:Att läsa stora MySQL-tabeller i DataFrame misslyckas

  4. Hur man får gårdagens datum i PostgreSQL