2010-06-25 6 views
5

Od czasu do czasu występują problemy z naszym serwerem MySQL. Ciągle wyrzuca wiele tych zapytań jednocześnie (w ten sposób umieszczając je w mojej liście procesów). Używamy MyISAM db i łączenia połączeń poprzez Glassfish v3 dla aplikacji Grails.Dlaczego nadal uzyskuję Konwertowanie HEAP na MyISAM na moim serwerze mysql

użytkownik_bazy_danych myhost: 35143 db Query 39

converting HEAP to MyISAM /* mysql-connector-java-5.1.7 (Revision:) */SHOW VARIABLES WHERE Variable_name ='language' OR Variable_name = 'net_write_timeout' OR Variable_name = 'interactive_timeout' OR Variable_name = 'wait_timeout' OR Variable_name = 'character_set_client' OR Variable_name = 'character_set_connection' OR Variable_name = 'character_set' OR Variable_name = 'character_set_server' OR Variable_name = 'tx_isolation' OR Variable_name = 'transaction_isolation' OR Variable_name = 'character_set_results' OR Variable_name = 'timezone' OR Variable_name = 'time_zone' OR Variable_name = 'system_time_zone' OR Variable_name = 'lower_case_table_names' OR Variable_name = 'max_allowed_packet' OR Variable_name = 'net_buffer_length' OR Variable_name = 'sql_mode' OR Variable_name = 'query_cache_type' OR Variable_name = 'query_cache_size' OR Variable_name = 'init_connect' 

Możemy spekulować, że istnieją tabele tymczasowe tworzone przez GORM (z Grails ORM), które powodują te pytania. Dlaczego ciągle otrzymuję konwersję HEAP na MyISAM na moim serwerze mysql?

Odpowiedz

6

O komunikacie converting HEAP to MyISAM następujące answer pisze:

Dzieje się tak, gdy tabele tymczasowe tworzone przez MySQL w pośrednich etapów przetwarzania zapytań rosną zbyt duże, aby być przechowywane w pamięci. O ile mi wiadomo, robiąc to MySQL zapisuje tymczasowe tablice MyISAM niezależnie od używanego silnika baz danych (to tylko tabela tymczasowa, która zostanie usunięta na końcu zapytania). Nie stanowi to problemu, z wyjątkiem czasu, w którym trwa proces.

Najprostszym rozwiązaniem jest zwiększenie tmp_table_size, może być tymczasowo, jeśli wykonujesz prace konserwacyjne. Jeśli to nie wystarczy, podziel fragmenty swojej kwerendy za pomocą LIMIT i OFFSET i zwiększ OFFSET, aby pokryć całą tabelę, którą czytasz w zapytaniu. Jeśli czytasz kilka dużych tabel w zapytaniu i chcesz ograniczyć każdy z nich, nie zapomnij uwzględnić wszystkich kombinacji tabel: np. jeśli użyjesz DWÓCH tabel i chcesz podzielić każdy z nich na TRZY części, będziesz potrzebował powtórzyć SZYBKIE zapytania OFFSET-TED z różnymi kombinacjami rosnących wartości PRZESUNIĘCIE. Plik wsadowy będzie dostępny pod ręką, aby ułatwić to.

W związku z tym MySQL tworzy tabele w pamięci (i potencjalnie przekształca je w tymczasowe tabele MyISAM), a nie Grails. Ale rozumiem, że mogą wynikać z zbyt ciężkich pytań.

+0

Dodawanie: Bit rozpoczynający się od komentarza wychodzi z Connector-J, gdy jest nawiązywane nowe połączenie. (To jest w com.mysql.jdbc.ConnectionImpl # loadServerVariables, jeśli chcesz wyglądać.) Jeśli widzisz ich bardzo dużo, sprawdziłbym, czy połączenie połączeń działa zgodnie z oczekiwaniami, a twoje MySQL jest skonfigurowany do odpowiedniej liczby połączeń. –

+0

Wciąż czytam tę wiadomość, gdy uruchamiam kwerendę heacy na tabeli, która jest MyISAM. Skąd się bierze ta kupa? – chiliNUT