关于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); 和这个对比
//优化数据库慢查询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 ); 问ChatGPT吧。。 问ChatGPT吧。。 这两个方法都有优化 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 来优化分页查询的性能。
原来你在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]