sql >> Databáze >  >> RDS >> Mysql

Aktualizace pomocí `database/sql` v Go je pomalá

(Mluvíme-li z pohledu MySQL...)

Některá "Pravidla":

  • Jeden INSERT :10 ms
  • 100 nebo více řádků vložených jedním INSERT :10krát rychleji na řádek.
  • BEGIN; INSERT...; INSERT...; ... COMMIT; :Také 10x.
  • Výše uvedené předpokládá HDD; SSD může být ještě 10x rychlejší.
  • Pokud více připojení provádí vkládání, mohou moci běžet paralelně. 10 vláken může být schopno provést 5krát více práce za stejnou dobu. (To samozřejmě může přidat aplikaci nežádoucí složitost.)

Podobné hodnoty pro UPDATE , i když není snadné provádět různé aktualizace na různých řádcích pomocí jediného dotazu.

Váš test ukazuje 8,5 ms na řádek UPDATEd když děláte jeden řádek po druhém. Dávkování buď pomocí BEGIN...COMMIT bude pravděpodobně trvat asi 85 ms pro všech 100 řádků, dokonce i na HDD.

Některé aplikace se hodí k dávkování; někteří ne. Pokud chcete mluvit o zlepšení výkonu MySQL, musíme se dostat do detailů vaší aplikace.

Počítadla „To se mi líbí“ a „Zobrazit“ mohou je třeba přesunout do „paralelní“ tabulky, protože mají tendenci být aktualizovány po jednom, s určitým zásahem do jiné činnosti. Mají také tendenci automaticky umožňovat vícevláknové zpracování, tedy mnohem méně než 850 ms na 100. Při opravdu vysoké aktivitě (přes, řekněme, 1 000 zobrazení za sekundu) lze takové čítače uměle dávkovat pomocí extra kódu aplikace.

Přepište prosím svůj benchmark tak, aby odrážel aktivitu, ke které dojde ve skutečné aplikaci. (hádám že aktualizace budou probíhat paralelně, nikoli sériově. A budou rozloženy náhodně v čase.)

Další věc... Pokud každý "počet zobrazení" přichází na webový server, pak je zde také připojení a odpojení; tedy uplynulo čas bude pravděpodobně více než 8,5 ms. Ale "uplynulo" není kritickým problémem; skutečný problém je „kolik aktualizací lze provést za sekundu“.)

A další věc... Pokud testujete 'paralelně', nezasahujte u každého požadavku do stejného řádku. To bude pravděpodobně mnohem pomalejší, než kdybyste trefili různé řádky. (Lepší by bylo zasáhnout náhodnou řadu. Předpojatost, do které řady zasáhnout, by bylo ještě realističtější.)




  1. Převeďte razítko MySql DateTime do formátu Datum v JavaScriptu

  2. Jak přidat výchozí omezení do existujících sloupců v tabulce SQL Server - SQL Server / Výukový program TSQL, část 91

  3. Vývoj vícetabulkové databáze Android SQLite

  4. SQL Server BCP Export kde čárka v poli SQL