Jak oszacować operacje we / wy wykonywane przez zapytania MySQL?

13

W usłudze Amazon RDS płacisz około 0,10 USD za 1 milion żądań We / Wy. Zauważyłem bardzo dużą liczbę (w setkach tysięcy) żądań We / Wy dla bazy danych o bardzo niskim ruchu. Widząc to, przeprowadziłem dalsze badania i znalazłem to pytanie, które opisuje, że dla 6000 witryn użytkowników generował 800 milionów żądań We / Wy miesięcznie, co kosztowałoby go około 80 USD miesięcznie.

Dlatego chcę z góry wiedzieć, ile operacji we / wy wygenerowałoby zapytanie MySQL i jak je zoptymalizować / zminimalizować. Czy jest jakiś sposób na oszacowanie, ile operacji we / wy wykonałoby zapytanie i jakie ogólne zasady, których mogę przestrzegać, aby utrzymać je na jak najniższym poziomie?

Kliknij opcję Upvote
źródło

Odpowiedzi:

2

Odpowiedź Wiki Wiki wygenerowana z komentarzy na pytanie Raymonda Nijlanda

Zastosowanie EXPLAIN. W ten sposób możesz sprawdzić, czy zapytanie MOŻE potrzebować dysku IO. W kolumnie należy unikać dodatkowych „Korzystanie z tymczasowych” lub „” Korzystanie z tymczasowych; Korzystanie z sortowania plików (zwróć uwagę, że sortowanie plików jest mylącą nazwą: jeśli zestaw wyników mieści się w pamięci, szybkie sortowanie jest uruchamiane w pamięci) ".

Najprawdopodobniej jest to spowodowane podkwerendami / związkami / kolejnością według / grupowania według / ... Jeśli Twój wynik jest duży i tworzona jest tymczasowa tabela dyskowa MyISAM, i musisz posortować wynik, sortujesz wynik zestaw oparty na odczytach We / Wy i zapisach We / Wy z algorytmem szybkiego sortowania.

W wewnętrznym zastosowaniu tabeli tymczasowej w MySQL możesz odczytać, kiedy MySQL musi utworzyć tabelę MyISAM opartą na dysku. Być może możesz użyć avg_row_length * wierszy (choć zauważ, że wartość wierszy z wyjaśnienia nie jest dokładna w silniku InnoDB), aby sprawdzić, czy wynik mieści się w stercie. Zobacz SKŁADANIE STATUSU TABELI .

Ogólnie rzecz biorąc, czy InnoDB lub MyISAM jest lepszy do unikania żądań We / Wy?

InnoDB buforuje dane tabeli i dane indeksu, podczas gdy MyISAM buforuje tylko klucze indeksu. Konieczne jest we / wy danych tabeli, gdy dodatkowe wyjaśnienie kolumny nie mówi „Korzystanie z indeksu”.

Jeśli oba używają indeksów: W przypadku InnoDB, jeśli bufor jest gorący, może ładować dane z pamięci. Jeśli indeksy muszą pochodzić z dysku, istnieje formuła, której można użyć do obliczenia potrzebnych odczytów We / Wy dla zaznaczeń, wstawek i aktualizacji. Z oszacowania wydajności zapytania :

W przypadku małych tabel zwykle można znaleźć wiersz w jednym poszukiwaniu dysku (ponieważ indeks jest prawdopodobnie buforowany). W przypadku większych tabel możesz oszacować, że korzystając z indeksów B-drzewa potrzeba wielu prób znalezienia wiersza:

log(rows) / log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) + 1

Indeksy InnoDB są większe, ponieważ przechowują dane poza kluczem PRIMARY / UNIQUE w indeksie KEY. Jest to szybsze i wymaga jeszcze mniej operacji we / wy, ale można kompresować dane InnoDB lub indeksy.

Paul White
źródło