·设为首页收藏本站📧邮箱修改🎁免费下载专区💎积分✅卡密📒收藏夹👽聊天室
返回列表 发布新帖

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

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
关于WP数据库优化,看看这2段代码 哪段是对的?
  1. if (!function_exists('maizi_set_no_found_rows')) {    /**     * 设置WP_Query的 'no_found_rows' 属性为true,禁用SQL_CALC_FOUND_ROWS     *     * @param  WP_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);
复制代码
我要说一句 收起回复
创宇盾启航版免费网站防御网站加速服务

评论5

婷姐Lv.8 发表于 6 天前 | 查看全部
和这个对比
  1. //优化数据库慢查询if ( ! function_exists( 'banzhuti_set_no_found_rows' ) ) :     /**     * 设置WP_Query的 'no_found_rows' 属性为true,禁用SQL_CALC_FOUND_ROWS     * 更多优化教程-搬主题www.banzhuti.com     * @param  WP_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αlLv.8 发表于 6 天前 | 查看全部
问ChatGPT吧。。
我要说一句 收起回复
独家记忆Lv.8 发表于 6 天前 | 查看全部
问ChatGPT吧。。
我要说一句 收起回复
IT618发布Lv.8 发表于 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αlLv.8 发表于 6 天前 | 查看全部
原来你在https://www.4414.cn/forum.php?mod=viewthread&tid=169272&page=3#pid2158067 分享过第一种方法。

wepublish耗子分享:WordPress 祖传使用SQL_CALC_FOUND_ROWS进行数量统计并计算分页,但是这个查询语句在大数据量 (W+) 的情况下是很慢的,一个比较好的解决方法是将其替换成更为现代的COUNT语句:
  1. <?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 ();
复制代码
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

创宇盾启航版免费网站防御网站加速服务
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:3.135.241.191,GMT+8, 2024-12-23 23:20 , Processed in 0.204144 second(s), 109 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2024 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表