𝕷𝖎𝖑𝖏𝖆𝖈𝖐 发表于 6 天前

关于WP数据库优化,看看这2段代码 哪段是对的?

关于WP数据库优化,看看这2段代码 哪段是对的?

if (!function_exists('maizi_set_no_found_rows')) {    /**   * 设置WP_Query的 'no_found_rows' 属性为true,禁用SQL_CALC_FOUND_ROWS   *   * @paramWP_Query $wp_query WP_Query实例   * @return void   */    function maizi_set_no_found_rows(\WP_Query $wp_query)    {      $wp_query->set('no_found_rows', true);    }}add_filter('pre_get_posts', 'maizi_set_no_found_rows', 10, 1);if (!function_exists('maizi_set_found_posts')) {    /**   * 使用 EXPLAIN 方式重构   */    function maizi_set_found_posts($clauses, \WP_Query $wp_query)    {      // Don't proceed if it's a singular page.      if ($wp_query->is_singular()) {            return $clauses;      }      global $wpdb;      $where = isset($clauses['where']) ? $clauses['where'] : '';      $join = isset($clauses['join']) ? $clauses['join'] : '';      $distinct = isset($clauses['distinct']) ? $clauses['distinct'] : '';      $wp_query->found_posts = (int)$wpdb->get_row("EXPLAIN SELECT $distinct * FROM {$wpdb->posts} $join WHERE 1=1 $where")->rows;      $posts_per_page = (!empty($wp_query->query_vars['posts_per_page']) ? absint($wp_query->query_vars['posts_per_page']) : absint(get_option('posts_per_page')));      $wp_query->max_num_pages = ceil($wp_query->found_posts / $posts_per_page);      return $clauses;    }}add_filter('posts_clauses', 'maizi_set_found_posts', 10, 2);

婷姐 发表于 6 天前

和这个对比
//优化数据库慢查询if ( ! function_exists( 'banzhuti_set_no_found_rows' ) ) :   /**   * 设置WP_Query的 'no_found_rows' 属性为true,禁用SQL_CALC_FOUND_ROWS   * 更多优化教程-搬主题www.banzhuti.com   * @paramWP_Query $wp_query The WP_Query instance.      * @return void   */    function banzhuti_set_no_found_rows( \WP_Query $wp_query ) {      $wp_query->set( 'no_found_rows', true );    }endif;add_filter( 'pre_get_posts', 'banzhuti_set_no_found_rows', 10, 1 ); if ( ! function_exists( 'banzhuti_set_found_posts' ) ) :   /**   * Workout the pagination values.   *   * 为这个wp_query构建和设置分页结果   *   */    function banzhuti_set_found_posts( $clauses, \WP_Query $wp_query ) {         // Don't proceed if it's a singular page.      if ( $wp_query->is_singular()) {            return $clauses;      }         global $wpdb;         $where = isset( $clauses[ 'where' ] ) ? $clauses[ 'where' ] : '';      $join = isset( $clauses[ 'join' ] ) ? $clauses[ 'join' ] : '';      $distinct = isset( $clauses[ 'distinct' ] ) ? $clauses[ 'distinct' ] : '';         // 构建并运行查询。将结果设为'found_posts'      // 在我们要运行的主要查询上设置参数.      $wp_query->found_posts = $wpdb->get_var( "SELECT $distinct COUNT(*) FROM {$wpdb->posts} $join WHERE 1=1 $where" );         // 计算出每页应该有多少文章      $posts_per_page = ( ! empty( $wp_query->query_vars['posts_per_page'] ) ? absint( $wp_query->query_vars['posts_per_page'] ) : absint( get_option( 'posts_per_page' ) ) );         // 设置max_num_pages(最大页数).      $wp_query->max_num_pages = ceil( $wp_query->found_posts / $posts_per_page );         // Return the $clauses so the main query can run.      return $clauses;    }endif;add_filter( 'posts_clauses', 'banzhuti_set_found_posts', 10, 2 );

Crystαl 发表于 6 天前

问ChatGPT吧。。

独家记忆 发表于 6 天前

问ChatGPT吧。。

IT618发布 发表于 6 天前

这两个方法都有优化 WordPress 数据库查询的作用,但适用场景和侧重点不同,因此不能简单地说哪个更有用,而是需要根据你的需求和场景选择。
方法 1: banzhuti_set_no_found_rows核心功能:
将 no_found_rows 参数设置为 true,禁用 SQL 查询中的 SQL_CALC_FOUND_ROWS。
[*]适用场景:
查询结果不需要分页的场景,比如首页文章列表或特定的文章展示。
[*]你希望减少查询中 SQL_CALC_FOUND_ROWS 的性能开销,因为这个操作会扫描所有匹配记录,哪怕只需要一页的数据。

优点:
减少查询的复杂度和数据库负载。在只需要获取一定数量的结果(例如 posts_per_page 条)时,非常有用。
缺点:
如果你需要分页(如显示页码)或获取总记录数(found_posts),这个方法会导致分页功能失效。
方法 2: banzhuti_set_found_posts核心功能:
替换 WordPress 默认的 found_posts 计算方式,手动执行一个更简单的 COUNT(*) 查询来获取总记录数和计算分页。
[*]适用场景:
查询结果需要分页,并且要正确计算 found_posts 和 max_num_pages。
[*]你希望避免 WordPress 在主查询中使用 SQL_CALC_FOUND_ROWS,但仍然需要总记录数的计算。

优点:
提供了更高效的分页计算方式。减少对默认 SQL_CALC_FOUND_ROWS 的依赖,但仍然支持分页功能。
缺点:
增加了一次单独的数据库查询。如果查询的 WHERE 或 JOIN 条件复杂,这个手动查询仍然可能产生一定的性能开销。
哪个方法更有用?
如果你的查询不需要分页:banzhuti_set_no_found_rows 是更直接的优化方法,完全禁用 SQL_CALC_FOUND_ROWS 会显著提升查询性能。如果你的查询需要分页:banzhuti_set_found_posts 是更合适的选择,因为它在优化性能的同时仍然支持分页功能。
综合建议:
如果可以,优先尝试优化不需要分页的查询,使用 banzhuti_set_no_found_rows,因为这是减少数据库负载的最佳方式。如果分页不可避免,使用 banzhuti_set_found_posts 来优化分页查询的性能。

Crystαl 发表于 6 天前

原来你在https://www.4414.cn/forum.php?mod=viewthread&tid=169272&page=3#pid2158067 分享过第一种方法。

wepublish耗子分享:WordPress 祖传使用SQL_CALC_FOUND_ROWS进行数量统计并计算分页,但是这个查询语句在大数据量 (W+) 的情况下是很慢的,一个比较好的解决方法是将其替换成更为现代的COUNT语句:<?PHP/** * Plugin Name: Fix WordPress Slow Queries * Description: Fix WordPress Slow Queries * Author: Mahdi Akrami * Version: 1.0.0 */class FIX_WP_SLOW_QUERY {      public static function init () {                /**               * WP_Query               */                add_filter ( 'found_posts_query', [ __CLASS__, 'add_found_rows_query' ], 999, 2 );                add_filter ( 'posts_request_ids', [ __CLASS__, 'remove_found_rows_query' ], 999 );                add_filter ( 'posts_pre_query', function ( $posts, \WP_Query $query ) {                        $query->request = self::remove_found_rows_query ( $query->request );                        return $posts;                }, 999, 2 );                add_filter ( 'posts_clauses', function ( $clauses, \WP_Query $wp_query ) {                        $wp_query->fw_clauses = $clauses;                        return $clauses;                }, 999, 2 );      }      public static function remove_found_rows_query ( $sql ) {                return str_replace ( ' SQL_CALC_FOUND_ROWS ', '', $sql );      }      public static function add_found_rows_query ( $sql, WP_Query $query ) {                global $wpdb;                $distinct = $query->fw_clauses['distinct'] ?? '';                $join   = $query->fw_clauses['join'] ?? '';                $where    = $query->fw_clauses['where'] ?? '';                $groupby= $query->fw_clauses['groupby'] ?? '';                $count = 'COUNT (*)';                if ( ! empty ( $groupby ) ) {                        $count = "COUNT ( distinct $groupby )";                }                return "                        SELECT $distinct $count                        FROM {$wpdb->posts} $join                        WHERE 1=1 $where                ";      }}FIX_WP_SLOW_QUERY::init ();
页: [1]
查看完整版本: 关于WP数据库优化,看看这2段代码 哪段是对的?

创宇盾启航版免费网站防御网站加速服务