/ / Optymalna konfiguracja tabel tymczasowych MySQL (tabele pamięci)? - sql, mysql, wydajność, optymalizacja, temp-tabele

Optymalna konfiguracja tabel tymczasowych MySQL (tabele pamięci)? - sql, mysql, wydajność, optymalizacja, temp-tabele

Przede wszystkim jestem nowy w optymalizacji mysql. Faktem jest, że mam w mojej aplikacji internetowej (około 400 zapytań na sekundę) zapytanie, które używa GROUP BY których nie mogę uniknąć i to jest przyczyną tworzenia tymczasowych tabel. Moja konfiguracja była:

max_heap_table_size = 16M
tmp_table_size = 32M

Wynik: tabela temp do dysku procent + 12,5%

Potem zmieniłem ustawienia, zgodnie z ten post

max_heap_table_size = 128M
tmp_table_size = 128M

Wynik: tabela temp do dysku procent + 18%

Wyniki nie były oczekiwane, nie rozumiem dlaczego.

To jest złe tmp_table_size = max_heap_table_size? Nie należy zwiększać rozmiaru?

Pytanie

SELECT images, id
FROM classifieds_ads
WHERE  parent_category = "1" AND published="1" AND outdated="0"
GROUP BY aux_order
ORDER BY date_lastmodified DESC
LIMIT 0, 100;

WYJAŚNIAĆ

| 1 |SIMPLE|classifieds_ads | ref |parent_category, published, combined_parent_oudated_published, oudated | combined_parent_oudated_published | 7 | const,const,const | 67552 | Using where; Using temporary; Using filesort |

Odpowiedzi:

9 dla odpowiedzi № 1

"Using temporary" w raporcie EXPLAIN nie mówi nam, że tabela temp była na dysku. Mówi nam tylko, że zapytanie oczekuje utworzenia tabeli tymczasowej.

Tabela temp pozostanie w pamięci, jeśli jej rozmiar jest mniejszy niż tmp_table_size i mniej niż max_heap_table_size.

Max_heap_table_size jest największą tabelą, która może znajdować się w silniku pamięci MEMORY, bez względu na to, czy ta tabela jest tabelą tymczasową, czy tabelą, która nie jest tymczasowa.

Tmp_table_size jest największą tabelą, w której można się znaleźćpamięć, gdy jest tworzona automatycznie przez zapytanie. Ale to nie może być większe niż max_heap_table_size, tak więc nie ma żadnej korzyści z ustawienia tmp_table_size większego niż max_heap_table_size. Często ustawia się te dwie zmienne konfiguracyjne na tę samą wartość.

Możesz monitorować, ile tabel tymczasowych zostało utworzonych, a ile na takim dysku:

mysql> show global status like "Created%";
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 20    |
| Created_tmp_files       | 6     |
| Created_tmp_tables      | 43    |
+-------------------------+-------+

Uwaga: w tym przykładzie utworzono 43 tabele tymczasowe, ale tylko 20 z nich znajdowało się na dysku.

Po zwiększeniu limitów parametrów tmp_table_size i max_heap_table_size, można zezwolić na większe tabele tymczasowe w pamięci.

Możesz zapytać, jak duże jest to potrzebne? Nie musisz koniecznie robić tego na tyle dużego, aby zmieścił się każdy z nich w pamięci. Możesz chcieć zmieścić 95% twoich tymczasowych tabel w pamięci i tylko pozostałe rzadkie tabele zostaną zapisane na dysku. bardzo duże - dużo większe niż ilość pamięci, którą chcesz za to wykorzystać.

Tak więc moją praktyką jest ostrożne zwiększanie tmp_table_size i max_heap_table_size. Następnie obejrzyj stosunek z Created_tmp_disk_tables do Created_tmp_tables, aby sprawdzić, czy spełniłem swój cel polegający na tym, że 95% z nich pozostanie w pamięci (lub jakimkolwiek współczynniku, który chcę zobaczyć).

Niestety, MySQL nie ma na to dobrego sposobudokładnie powiedzieć, jak duże były tabele tymczasowe. To będzie się różnić w zależności od zapytania, więc zmienne statusu nie mogą tego pokazywać, mogą tylko pokazywać liczbę wystąpień, a EXPLAIN nie wykonuje faktycznie zapytania, aby nie mógł dokładnie określić, ile danych będzie pasować.

Alternatywą jest Serwer Percona, który jest dystrybucją MySQL z ulepszeniami. Jednym z nich jest zapisuj dodatkowe informacje w dzienniku powolnego zapytania. Zawarte w dodatkowych polach jest wielkość wszystkich tabel tymczasowych utworzonych przez dane zapytanie.