Czytam z przykładowego pliku konfiguracyjnego, który mówi:
# Sort buffer is used to perform sorts for some ORDER BY and GROUP BY
# queries. If sorted data does not fit into the sort buffer, a disk
# based merge sort is used instead - See the "Sort_merge_passes"
# status variable. Allocated per thread if sort is needed.
Mam kilka zapytań, które używają sortowania plików. Jak ustalić rozmiar bufora, którego potrzebuję, aby zapytania działały płynnie bez uderzania w dysk?
Odpowiedzi:
Jest tylko jedna zmienna statusu, która dba o sort_buffer_size . To właśnie masz w wiadomości z powrotem w pytaniu: Sort_merge_passes . Dokumentacja MySQL mówi:
Pamiętaj o jednej rzeczy dotyczącej sort_buffer_size
Podczas gdy podnoszenie
sort_buffer_size
może pomóc w zapytaniach za pomocąGROUP BY
s iORDER BY
s, lepiej jest ulepszyć zapytania, które można ulepszyć, i dodać indeksy, których można użyć w Optymalizatorze zapytań.Pozostaje pytanie: Jak sprawdzić przepustki Sort_merge_ ?
Użyj tego kodu, aby sprawdzić, ile przepustek Sort_merge_pass miało miejsce w ciągu ostatnich 5 minut. Oblicza również przepustki Sort_merge_ na godzinę.
Jeśli znajdziesz Sort_merge_passes i wskaźnik jest zbyt wysoki, możesz zwiększyć sort_buffer_size . Załóżmy, że chcesz podbić do 4M. Uruchomiłbyś to:
Dodałbyś to do my.cnf
Od czasu do czasu uruchamiałbyś kod, aby sprawdzić, czy nie występuje inny czas Sort_merge_passes spikes.
źródło
Nie trzeba zmieniać domyślnego rozmiaru sort_buffer_size. Nie rozumiesz jego użycia na podstawie pytania. Powinieneś zacząć od sprawdzenia SQL, aby sprawdzić, czy możesz go dostroić i spełnić warunki ORDER BY / GROUP BY za pomocą indeksu. Zasadniczo będzie to indeks złożony.
Ponadto: http://www.xaprb.com/blog/2010/05/09/how-to-tune-mysqls-sort_buffer_size/
źródło
.cnf
plikach dostarczanych z mysql nie jest używane ustawienie domyślne.Wskazówki zawarte w instrukcji (5.0–5.5) to
Począwszy od 5.6, sformułowanie wskazuje, że optymalizator może wybrać wartość dla zapytania i że serwer może rozszerzyć bufor do limitu. Zmniejsza to koszt ustawienia zbyt wysokiej wartości. Brzmi więc to tak, jakbyś chciał być konserwatywny, niższy niż domyślny (jak to robią pliki cnf w wydaniu) dla wersji poniżej 5.6.4, ale może sobie pozwolić na wyższy limit, powiedzmy, domyślny 2 MB, a nawet więcej, od 5.6. 4, ponieważ pełna kwota nie jest ślepo przydzielana.
źródło
Najlepszym sposobem na określenie optymalnego
sort_buffer_size
jest przeprowadzenie testu porównawczego.W jaki sposób? Podobnie jak @RolandoMySQLDBA powiedział, że sprawdzanie
Sort_merge_passes
może być pomocne, ale to nie jedyny czynnik wpływający na wydajność. Powinieneś być ostrożny przy zwiększaniusort_buffer_size
.Dokument tak mówi
Jest post o testowaniu, który to kończy
Kiedy testowałem, otrzymałem również podobny wynik.
Najlepiej byłoby uniknąć sytuacji, w której trzeba zoptymalizować
sort_buffer_size
. W jaki sposób? Ten dokument optymalizacyjny ORDER BY może pomóc ci zrozumieć, jak działają rzeczy pod maską.źródło
„mysql> SET GLOBAL sort_buffer_size = 1024 * 1024 * 4;” to zły sposób na umieszczenie w buforze sortującym 4m rozmiaru bufora sortującego, co powoduje, że bufor buforowy sortowania ma 4GB użycia
„mysql> SET GLOBAL sort_buffer_size = 1024 * 4;”
Jeśli byłem twój, nie próbuję zmieniać rozmiaru krótkiego bufora, to dobry sposób na zawieszenie serwera i wysłanie go do kosza. Lepiej spróbuj tworzyć lepsze zapytania.
źródło
1024 * 4
. To 4096, 4K.