mysql — Jak zoptymalizować zapytanie „select found_rows()”? Kilka alertów o „wysokim średnim obciążeniu” dziennie
Mam 5000 zwykłych postów, 6000 postów w jednym typie postów i 2000 postów w innym typie postów. Nie trzeba dodawać, że sprawiło, że wp_posts
stół dość duży. Nie wspominając o tym, że mam skonfigurowane niestandardowe taksonomie, aby naśladować typy postów, więc dla każdej firmy A wprowadzonej do typu postu firmy istnieje firma A, ręcznie wprowadziłem firmę A do taksonomii firmy. W ten sposób, kiedy robię regularny post o Firmie A, mogę skutecznie etykietka Firmę A do posta, a następnie ten post pojawi się na stronie niestandardowego typu posta Firmy A.
Specyfikacja: Uruchamianie WP Super Cache z Cloudflare jako CDN. Tematem jest WordPress TwentyEleven, ale mocno dostosowany. serwer: 2048 RAM, 80 GB Raid, 8 + CPU 4x priorytet, przepustowość 5000 GB. Ruch to 750 000 wyświetleń miesięcznie i 200 000 unikatów.
Zaczynam zauważać, że problemy z wydajnością narastają dość szybko, z dwoma przypadkami w zeszłym tygodniu, kiedy otrzymałem błąd
błąd połączenia z bazą danych
wiadomość na stronie i musiałem zrestartować usługę mysql. Nie wspominając już o wysokim średnim obciążeniu e-maili kilka razy dziennie.
Uruchomiono zapytania debugowania. Uruchomiłem go za pomocą WP Super Cache. Odinstalowałem WP Super Cache i wypróbowałem W3 Total Cache z większością włączonych opcji. W obu próbach widziałem najdłuższy czas ładowania spowodowany tymi dwoma zapytaniami (ale tylko przy pierwszym ładowaniu! Prawie 0 przy kolejnych ładowaniach):
Time: 7.79628753662E-5
Query: SELECT FOUND_ROWS()
Call from: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), include('/themes/child-theme/index.php'), WP_Query->__construct, WP_Query->query, WP_Query->get_posts, WP_Query->set_found_posts, W3_Db->query, W3_DbCache->query, W3_DbCallUnderlying->query, W3_Db->query, W3_DbProcessor->query, W3_Db->default_query
Time: 6.29425048828E-5
Query: SET SESSION query_cache_type = 0;
Call from: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), include('/themes/child-theme/index.php'), get_footer, locate_template, load_template, require_once('/themes/child-theme/footer.php'), wp_footer, do_action('wp_footer'), call_user_func_array, Debug_Queries->the_queries, Debug_Queries->get_queries, W3_Db->query, W3_DbCache->query, W3_DbCallUnderlying->query, W3_Db->query, W3_DbProcessor->query, W3_Db->default_query
Usunąłem tablicę, która sprawiła, że oprócz zwykłych postów szukaliśmy typów postów, ale to nie miało znaczenia.
Pełny przykładowy wynik zapytania:
Oto także kod szablonu dla głównego indeksu:
<?php if ( have_posts() ) : ?>
<?php /* Start the Loop */ ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php if ( 'status' == get_post_format() ) {
get_template_part( 'content-status', get_post_format() );
} else get_template_part( 'excerpt', get_post_format() );
?>
<?php endwhile; ?>
Naprawdę nie jestem pewien, gdzie się udać.