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

MySQL/InnoDB i długotrwałe zapytania

Po pierwsze, myślę, że przydałoby się jako tło przeczytać na temat kontrola współbieżności wielu wersji (MVCC) jako tło tej odpowiedzi.

InnoDB implementuje MVCC, co oznacza, że ​​może używać odczytów bez blokowania dla zwykłych SELECT . Nie wymaga to tworzenia „migawki” iw rzeczywistości InnoDB nie ma żadnej rzeczywistej koncepcji migawki jako obiektu. Zamiast tego każdy rekord w bazie danych śledzi swój własny numer wersji i utrzymuje „wskaźnik przewijania” do rekordu „cofnij dziennik” (który może nadal istnieć lub nie), który modyfikuje wiersz do poprzedniej wersji. Jeśli potrzebna jest starsza wersja rekordu, odczytywana jest bieżąca wersja, a te wskaźniki są śledzone i cofają rekordy, dopóki nie zostanie wytworzona wystarczająco stara wersja rekordu.

Zwykle system stale czyści te dzienniki cofania i ponownie wykorzystuje zajmowaną przez nie przestrzeń.

W dowolnym momencie dowolna długotrwała transakcja (uwaga, niekoniecznie pojedyncze zapytanie) jest obecne, dzienniki cofania muszą być przechowywane (nie usuwane), aby wystarczająco odtworzyć wystarczająco stare wersje wszystkich rekordów, aby spełnić tę transakcję. W bardzo obciążonym systemie te dzienniki cofania mogą bardzo szybko się akumulować, zużywając gigabajty miejsca. Dodatkowo, jeśli określone indywidualne rekordy są bardzo często modyfikowane, przywrócenie tego rekordu do wystarczająco starej wersji, aby spełnić zapytanie, może zająć bardzo wiele aplikacji do cofania dziennika (tysiące).

To właśnie sprawia, że ​​„długo działające zapytania” są drogie i źle widziane. Zwiększą zużycie miejsca na dysku do przechowywania dzienników cofania w obszarze tabel systemowych i będą działać słabo ze względu na aplikację cofania dziennika, która przywraca wersje wierszy po odczycie.

Niektóre bazy danych implementują maksymalną ilość miejsca w dzienniku cofania, które można wykorzystać, a po osiągnięciu tego limitu zaczynają wyrzucać starsze rekordy dziennika cofania i unieważniać uruchomione transakcje. Spowoduje to wygenerowanie komunikatu o błędzie „zbyt stara migawka” dla użytkownika. InnoDB nie ma takiego limitu i umożliwia akumulację w nieskończoność.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. BŁĄD 1452 (23000):Nie można dodać lub zaktualizować wiersza podrzędnego:ograniczenie klucza obcego nie powiodło się

  2. MySQL C++ Connector:niezdefiniowane odniesienie do `get_driver_instance'

  3. Czy warto używać razem MySQL i Neo4j?

  4. MySQL a PDO

  5. Jak wyeksportować bazę danych mysql za pomocą wiersza polecenia?