Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Aktualizacja za pomocą `database/sql` w Go jest powolna

(Mówiąc z punktu widzenia MySQL...)

Niektóre „zasady kciuka”:

  • Pojedynczy INSERT :10ms
  • 100 lub więcej wierszy wstawionych przez pojedynczą INSERT :10 razy szybciej na rząd.
  • BEGIN; INSERT...; INSERT...; ... COMMIT; :Również 10x.
  • Powyższe zakłada, że ​​dysk twardy; Dysk SSD może być jeszcze 10 razy szybszy.
  • Jeśli wiele połączeń wykonuje wstawianie, mogą być w stanie działać równolegle. 10 wątków może być w stanie wykonać 5 razy więcej pracy w tym samym czasie. (Oczywiście to może dodać niechcianą złożoność do aplikacji).

Podobne liczby dla UPDATE , chociaż nie jest łatwo wykonać różne aktualizacje w różnych wierszach za pomocą jednego zapytania.

Twój test pokazuje 8,5 ms na wiersz UPDATEd robiąc jeden rząd na raz. Grupowanie za pomocą BEGIN...COMMIT prawdopodobnie zajmie około 85 ms dla wszystkich 100 rzędów, nawet na dysku twardym.

Niektóre aplikacje nadają się do grupowania; niektórzy nie. Jeśli chcesz porozmawiać o poprawie wydajności MySQL, musimy poznać szczegóły Twojej aplikacji.

Liczniki „Lubię to” i „Wyświetl” mogą muszą zostać przeniesione do tabeli „równoległej”, ponieważ są one aktualizowane pojedynczo, z pewnymi zakłóceniami w innych czynnościach. Mają również tendencję do automatycznego zezwalania na wielowątkowość, a więc znacznie mniej niż 850 ms na 100. Przy naprawdę wysokiej aktywności (ponad, powiedzmy, 1 tys. wyświetleń na sekundę), takie liczniki mogą być sztucznie grupowane za pomocą dodatkowego kodu aplikacji.

Przepisz swój test porównawczy, aby odzwierciedlić aktywność, która będzie miała miejsce w rzeczywistej aplikacji. (zgaduję że aktualizacje będą odbywać się równolegle, a nie seryjnie. Zostaną one rozłożone losowo w czasie).

Kolejna sprawa... Jeśli każda "liczba wyświetleń" trafia na serwer WWW, to jest też łączenie i rozłączanie; stąd upłynął czas prawdopodobnie będzie dłuższy niż 8,5 ms. Ale „upływający” nie jest sprawą krytyczną; prawdziwym problemem jest „ile aktualizacji można wykonać na sekundę”.)

I jeszcze jedna rzecz... Jeśli testujesz "równolegle", nie uderzaj w ten sam wiersz przy każdym żądaniu. Będzie to prawdopodobnie znacznie wolniejsze niż w przypadku trafienia w różne rzędy. (Lepsze byłoby trafienie w losowy wiersz. Jeszcze bardziej realistyczne byłoby nastawienie, w który wiersz trafić).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jakiego rodzaju relacji wymagają te 2 tabele?

  2. Programowanie konsultacji podczas i jeśli zagnieżdżone

  3. Procedury składowane MySQL używają ich lub nie

  4. Jak zaprojektować bazę filmów?

  5. SQL liczący wszystkie wiersze zamiast zliczania pojedynczych wierszy