Langsame SQL_CALC_FOUND_ROWS-Abfrage

Bei Abfragen, die SQL_CALC_FOUND_ROWS im Bereich “Admin” von WordPress verwenden, ist die performance sehr SQL_CALC_FOUND_ROWS .

Wir haben derzeit ungefähr 125.000 Beiträge auf unserer Website und verwenden Varnish, um das Front-End zu cachen und sind auf WordPress Version 4.2.3.

Das Problem tritt auf, wenn Leute den Admin-Bereich von WordPress benutzen 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 plane einige Post-Revisionen zu entfernen und einige DB-Optimierung zu tun, aber zuerst wollte ich sehen, ob es in WordPress eine Art von Fix dafür gab.

Ich bin bei der Suche nach ähnlichen Problemen auf ähnliche Probleme gestoßen, aber die meisten dieser Probleme scheinen 2-6 Jahre alt zu sein.

Solutions Collecting From Web of "Langsame SQL_CALC_FOUND_ROWS-Abfrage"

$ query-> set (‘no_found_rows’, true);

Die Verwendung von SQL_CALC_FOUND_ROWS ist nicht wirklich ein Problem, obwohl es einen Overhead verursacht.

WordPress verwendet SQL_CALC_FOUND_ROWS , um die Gesamtzahl der Posts zu ermitteln, die zurückgegeben wurden, wenn keine LIMIT Klausel angegeben wurde. Dies ist notwendig, um korrekte Seitenzahlen zu berechnen und Ihnen korrekte Seitenzahlen zu geben.

Wenn Sie es bedingungslos deaktivieren, ist es garantiert, dass es überall bricht.

Wenn Sie bestimmte Abfragen identifizieren können, die von der Verwendung pre_get_posts , und Sie auf Paginierung verzichten können, dann können Sie an pre_get_posts und den Parameter pre_get_posts bedingt auf true setzen. Dies ist jedoch eher ein Hack als eine Lösung.

Die richtige Lösung ist die Verwendung eines databaseabfrage-Caching-Mechanismus entweder auf der Seite der database oder auf der WordPress-Seite mithilfe eines Plugins wie Advanced Post Cache (für WordPress.com entwickelt und verwendet).