wepublish耗子分享: WordPress 祖传使用SQL_CALC_FOUND_ROWS进行数量统计并计算分页,但是这个查询语句在大数据量 (W+) 的情况下是很慢的,一个比较好的解决方法是将其替换成更为现代的COUNT语句。 [ol]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 ();[/ol]复制代码
大江设计 发表于 2023-11-16 08:36 读写分离没搞过,不知道麻烦不 WordPress官方出品的HyperDB 是一个非常高级的数据库类,它取代了一些 WordPress 内置的数据库功能。主要区别是: * HyperDB 可以连接到任意数量的数据库服务器, * HyperDB 检查每个查询以确定合适的数据库。 它支持: 读写服务器(复制) 可配置的读写优先级 本地和远程数据中心 私人和公共网络 不同数据库/主机上的不同表 智能后写主读 故障主机的故障转移 用于分析的高级统计信息 WordPress 多站点 2022-06-23-18-20-30-image.png (216.65 KB, 下载次数: 0) 下载附件 保存到相册 3天前 上传 docker管理系统的URLOS有相关解决方案:https://www.urlos.com/urlos-document/introduction/mysql-master-slave.html 数据库一主多备实现的数据库主从集群,修改db-config.php内的数据库读写分离: [ol]$wpdb->add_database(array( 'host' => 'mysql57001_master', // 主要数据库地址 'user' => 'wordpress0_3c9db', 'password' => 'V4ex41r^pGU2E^7TP7l;cUaqcHLxaGa7nQvzz6CPA', 'name' => 'wordpress0_3c9db', 'write' => 1, // 给主要数据可写入 'read' => !defined('DB_HOST_RPL1') ? 1 : 0, // 当从数据库不可用时主要数据库才可读取,如果从数据库可用则从从数据库读取。));if(defined('DB_HOST_RPL1')): $wpdb->add_database(array( 'host' => 'mysql57001_slave', // 从数据库地址 'user' => 'wordpress0_3c9db', 'password' => 'V4ex41r^pGU2E^7TP7l;cUaqcHLxaGa7nQvzz6CPA', 'name' => 'wordpress0_3c9db', 'write' => 0, // 从数据库不可写入 'read' => 1, // 从数据库可读取 ));endif;[/ol]复制代码