wake-up-neo.net

Langsame SQL_CALC_FOUND_ROWS-Abfrage

Bei Abfragen, die SQL_CALC_FOUND_ROWS im Admin-Bereich von WordPress verwenden, ist die Leistung sehr langsam.

Wir haben derzeit ca. 125.000 Posts auf unserer Site und verwenden Varnish, um das Front-End zwischenzuspeichern. Außerdem verwenden wir WordPress, Version 4.2.3.

Das Problem tritt auf, wenn Benutzer den Admin-Bereich von WordPress verwenden und WordPress eine Abfrage wie die folgende ausführt:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM wp_posts 
WHERE 1=1 AND (((wp_posts.post_title LIKE '%denali%') 
OR (wp_posts.post_content LIKE '%denali%'))) 
AND wp_posts.post_type = 'post' 
AND (wp_posts.post_status = 'publish' 
OR wp_posts.post_status = 'future' 
OR wp_posts.post_status = 'draft' 
OR wp_posts.post_status = 'pending' 
OR wp_posts.post_status = 'private') 
ORDER BY wp_posts.post_title LIKE '%denali%' DESC, 
wp_posts.post_date DESC LIMIT 0, 20 

Gibt es einen Patch, um dieses Problem zu beheben, oder einen pre_get_posts-Filter, den ich ausführen kann?

Ich habe vor, einige Post-Revisionen zu entfernen und DB-Optimierungen vorzunehmen, wollte aber zunächst herausfinden, ob es in WordPress eine Art Korrektur dafür gibt.

Ich bin auf ähnliche Probleme gestoßen, als ich danach gesucht habe, aber die meisten dieser Probleme scheinen 2-6 Jahre alt zu sein.

4
bigmike7801

Die Verwendung von SQL_CALC_FOUND_ROWS ist kein wirkliches Problem, obwohl es einen Overhead verursacht.

Was passiert ist, dass WordPress SQL_CALC_FOUND_ROWS verwendet, um die Gesamtzahl der Beiträge zu ermitteln, die zurückgegeben worden wären, wenn keine LIMIT-Klausel angegeben worden wäre. Dies ist erforderlich, um korrekte Paginierungslinks zu berechnen und bereitzustellen.

Durch die bedingungslose Deaktivierung werden die Dinge garantiert überall zerbrochen.

Wenn Sie bestimmte Abfragen identifizieren können, die unter ihrer Verwendung leiden, und auf Paginierung verzichten können, können Sie eine Verknüpfung zu pre_get_posts herstellen und den Parameter no_found_rows unter bestimmten Bedingungen auf true setzen. Dies ist jedoch eher ein Hack als eine Lösung.

Die richtige Lösung besteht darin, einen Mechanismus zum Zwischenspeichern von Datenbankabfragen entweder auf der Seite der Datenbank oder auf der WordPress-Seite mit einem Plugin wie Advanced Post Cache (entwickelt für und verwendet in WordPress.com) zu verwenden.

1
Anastis