Re Slowlog:Pokaż nam swój plik my.cnf. Czy zmiany w [mysqld]
Sekcja? Przetestuj go za pomocą SELECT SLEEP(12);
, a następnie zajrzyj zarówno do pliku, jak i do tabeli.
Alternatywny sposób znalezienia zapytania:ponieważ zapytanie zajmuje kilka minut, wykonaj SHOW FULL PROCESSLIST;
kiedy myślisz, że może być uruchomiony.
Ile masz pamięci RAM? Nie mieć max_allowed_packet=300M
chyba że masz co najmniej 30 GB pamięci RAM. W przeciwnym razie ryzykujesz zamianą (lub nawet awarią). Zachowaj to ustawienie poniżej 1% pamięci RAM.
Aby uzyskać dalszą analizę strojów, podaj (1) rozmiar pamięci RAM, (2) SHOW VARIABLES;
oraz (3) SHOW GLOBAL STATUS;
.
Ponownie deleted_at
:Ten link, który podałeś, zaczyna się od "Kolumna usunięta_at nie jest dobrym kandydatem do indeksowania". Źle to zinterpretowałeś. Mówi o jednokolumnowym INDEX(deleted_at)
. Proponuję indeks złożony, taki jak INDEX(contact_id, job_class_name, execute_at, deleted_at)
.
158 sekund na proste zapytanie na małym stole? Możliwe, że jest wiele innych rzeczy się dzieje. Pobierz PROCESSLIST
.
Re Oddzielne indeksy od złożonych:Pomyśl o dwóch indeksach:INDEX(last_name)
i INDEX(first_name)
. Przeglądasz indeks nazwisk, aby znaleźć „James”, co wtedy możesz zrobić? Przeglądanie innego indeksu dla „Ricka” nie pomoże ci mnie znaleźć.
Analiza ZMIENNYCH i STANU GLOBALNEGO
Obserwacje:
- Wersja:5.7.22 log
- 1,00 GB pamięci RAM
- Czas pracy =16 dni 10:30:19
- Czy na pewno był to POKAŻ STAN GLOBALNY?
- Nie pracujesz w systemie Windows.
- Uruchomiona wersja 64-bitowa
- Wygląda na to, że działasz w całości (lub w większości) InnoDB.
Ważniejsze problemy:
innodb_buffer_pool_size -- Myślałem, że masz to w 213M, a nie 10M. 10M to zdecydowanie za mało. Z drugiej strony wydaje się, że masz mniej niż tyle danych.
Ponieważ pamięć RAM jest tak mała, zalecam zmniejszenie wartości tmp_table_size i max_heap_table_size i max_allowed_packet do 8M. I niższe table_open_cache, table_definition_cache i innodb_open_files do 500.
Co powoduje tyle jednoczesnych połączeń?
Szczegóły i inne obserwacje:
( innodb_buffer_pool_size / _ram ) = 10M / 1024M = 0.98%
-- % pamięci RAM używanej przez pulę_buforów InnoDB
( innodb_buffer_pool_size ) = 10M
-- InnoDB Data + Index cache
( innodb_lru_scan_depth ) = 1,024
-- „InnoDB:page_cleaner:zamierzona pętla 1000 ms zajęła ...” można naprawić, obniżając lru_scan_depth
( Innodb_buffer_pool_pages_free / Innodb_buffer_pool_pages_total ) = 375 / 638 = 58.8%
-- Część puli buforów nie jest obecnie używana -- innodb_buffer_pool_size jest większa niż to konieczne?
( Innodb_buffer_pool_bytes_data / innodb_buffer_pool_size ) = 4M / 10M = 40.0%
– Procent puli buforów zajętych przez dane – Niewielki procent może wskazują, że pula_buforów jest niepotrzebnie duża.
( innodb_log_buffer_size / _ram ) = 16M / 1024M = 1.6%
-- Procent pamięci RAM używanej do buforowania zapisów dziennika InnoDB.-- Zbyt duże odebranie z innych zastosowań pamięci RAM.
( innodb_log_file_size * innodb_log_files_in_group / innodb_buffer_pool_size ) = 48M * 2 / 10M = 960.0%
-- Stosunek rozmiaru dziennika do rozmiaru bufora_puli. Zalecane jest 50%, ale zobacz inne obliczenia, czy ma to znaczenie.-- Dziennik nie musi być większy niż pula buforów.
( innodb_flush_method ) = innodb_flush_method =
-- Jak InnoDB powinien prosić system operacyjny o zapisywanie bloków. Zasugeruj O_DIRECT lub O_ALL_DIRECT (Percona), aby uniknąć podwójnego buforowania. (Przynajmniej dla Uniksa.) Zobacz chrischandlera, aby uzyskać zastrzeżenie dotyczące O_ALL_DIRECT
( innodb_flush_neighbors ) = 1
-- Niewielka optymalizacja podczas zapisywania bloków na dysku.-- Użyj 0 dla dysków SSD; 1 na dysk twardy.
( innodb_io_capacity ) = 200
-- Liczba operacji we/wy na sekundę na dysku . 100 dla wolnych napędów; 200 dla napędów wirujących; 1000-2000 dla dysków SSD; pomnóż przez współczynnik RAID.
( innodb_print_all_deadlocks ) = innodb_print_all_deadlocks = OFF
-- Czy rejestrować wszystkie Zakleszczenia.-- Jeśli nękają Cię Zakleszczenia, włącz to. Uwaga:jeśli masz wiele zakleszczeń, może to spowodować duże zapisanie na dysku.
( min( tmp_table_size, max_heap_table_size ) / _ram ) = min( 16M, 16M ) / 1024M = 1.6%
-- Procent pamięci RAM do przydzielenia, gdy potrzebna jest tabela MEMORY (na tabelę) lub tabela temp wewnątrz SELECT (na tabelę temp na niektóre pozycje SELECT). Zbyt wysoka może prowadzić do zamiany.-- Zmniejsz tmp_table_size i max_heap_table_size do, powiedzmy, 1% pamięci RAM.
( net_buffer_length / max_allowed_packet ) = 16,384 / 16M = 0.10%
( local_infile ) = local_infile = ON
-- local_infile =WŁ. to potencjalny problem z bezpieczeństwem
( Select_scan / Com_select ) = 111,324 / 264144 = 42.1%
-- % zaznaczeń wykonujących pełne skanowanie tabeli. (Może zostać oszukany przez przechowywane procedury).-- Dodaj indeksy/optymalizuj zapytania
( long_query_time ) = 10
-- Odcięcie (w sekundach) do zdefiniowania „wolnego” zapytania.-- Sugeruj 2
( Max_used_connections / max_connections ) = 152 / 151 = 100.7%
-- Szczytowy % połączeń-- zwiększ max_connections i/lub zmniejsz wait_timeout
Masz połowę zniżki na pamięć podręczną zapytań. Należy ustawić zarówno query_cache_type =OFF , jak i query_cache_size =0 . Istnieje (zgodnie z plotką) „błąd” w kodzie QC, który pozostawia włączony kod, chyba że wyłączysz oba te ustawienia.
Rażąco mały:
( Innodb_pages_read + Innodb_pages_written ) / Uptime = 0.186
Created_tmp_files = 0.015 /HR
Handler_write = 0.21 /sec
Innodb_buffer_pool_bytes_data = 3 /sec
Innodb_buffer_pool_pages_data = 256
Innodb_buffer_pool_pages_total = 638
Key_reads+Key_writes + Innodb_pages_read+Innodb_pages_written+Innodb_dblwr_writes+Innodb_buffer_pool_pages_flushed = 0.25 /sec
Table_locks_immediate = 2.8 /HR
Table_open_cache_hits = 0.44 /sec
innodb_buffer_pool_chunk_size = 5MB
Rażąco duży:
Com_create_db = 0.41 /HR
Com_drop_db = 0.41 /HR
Connection_errors_peer_address = 2
Performance_schema_file_instances_lost = 9
Ssl_default_timeout = 500
Nieprawidłowe ciągi:
ft_boolean_syntax = + -><()~*:&
have_ssl = YES
have_symlink = DISABLED
innodb_fast_shutdown = 1
optimizer_trace = enabled=off,one_line=off
optimizer_trace_features = greedy_search=on, range_optimizer=on, dynamic_range=on, repeated_subselect=on
session_track_system_variables = time_zone, autocommit, character_set_client, character_set_results, character_set_connection
slave_rows_search_algorithms = TABLE_SCAN,INDEX_SCAN