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

Szybszy sposób na usuwanie pasujących wierszy?

Usunięcie danych z InnoDB jest najdroższą operacją, jakiej możesz zażądać. Jak już odkryłeś, samo zapytanie nie stanowi problemu - większość z nich i tak zostanie zoptymalizowana pod kątem tego samego planu wykonania.

Chociaż może być trudno zrozumieć, dlaczego DELETE we wszystkich przypadkach są najwolniejsze, istnieje dość proste wyjaśnienie. InnoDB to transakcyjny silnik pamięci masowej. Oznacza to, że jeśli zapytanie zostało przerwane w połowie, wszystkie rekordy nadal będą na swoim miejscu, tak jakby nic się nie wydarzyło. Po zakończeniu wszystko zniknie w tej samej chwili. Podczas DELETE inni klienci łączący się z serwerem będą widzieć rekordy do momentu zakończenia operacji DELETE.

Aby to osiągnąć, InnoDB wykorzystuje technikę zwaną MVCC (Multi Version Concurrency Control). Zasadniczo zapewnia każdemu połączeniu widok migawkowy całej bazy danych, tak jak w momencie rozpoczęcia pierwszej instrukcji transakcji. Aby to osiągnąć, każdy rekord w InnoDB wewnętrznie może mieć wiele wartości — po jednej dla każdego zrzutu. Z tego też powodu zliczanie w InnoDB zajmuje trochę czasu - zależy to od stanu migawki, który widzisz w tym czasie.

W przypadku transakcji DELETE każdy rekord zidentyfikowany zgodnie z warunkami zapytania zostaje oznaczony do usunięcia. Ponieważ inni klienci mogą uzyskiwać dostęp do danych w tym samym czasie, nie może natychmiast usunąć ich z tabeli, ponieważ muszą zobaczyć swój odpowiedni zrzut, aby zagwarantować niepodzielność usunięcia.

Gdy wszystkie rekordy zostaną oznaczone do usunięcia, transakcja zostanie pomyślnie zatwierdzona. I nawet wtedy nie można ich natychmiast usunąć z rzeczywistych stron danych, zanim wszystkie inne transakcje, które działały z wartością migawki przed transakcją DELETE, również się zakończą.

Tak więc w rzeczywistości twoje 3 minuty nie są tak wolne, biorąc pod uwagę fakt, że wszystkie rekordy muszą zostać zmodyfikowane, aby przygotować je do usunięcia w bezpieczny dla transakcji sposób. Prawdopodobnie „usłyszysz” działanie dysku twardego podczas działania instrukcji. Jest to spowodowane dostępem do wszystkich wierszy. Aby poprawić wydajność, możesz spróbować zwiększyć rozmiar puli buforów InnoDB dla swojego serwera i spróbować ograniczyć inny dostęp do bazy danych podczas usuwania, zmniejszając w ten sposób liczbę historycznych wersji, które InnoDB musi utrzymywać na record.Dzięki dodatkowej pamięci InnoDB może być w stanie odczytać Twoją tabelę (głównie) do pamięci i uniknąć trochę czasu na szukanie dysku.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak rozwiązać InnoDB:Nie można zablokować błędu mysql ./ibdata1?

  2. Zapytanie o konwersję z datetime na date mysql

  3. PHP + MySql + Procedury składowane, jak uzyskać dostęp do wartości wyjściowej?

  4. Załaduj dane z bazy danych MySQL do pól tekstowych HTML po kliknięciu przycisku

  5. Funkcja daty Mysql nie działa krócej niż