优化WordPress慢查询SQL_CALC_FOUND_ROWS导致卡顿严重,附代码
WordPress在查询post列表时,默认会同时把文章数量也查询出来,SQL_CALC_FOUND_ROWS MySQL 是一个慢查询,被 WordPress 用来在分页程序中获取查询结果总数量,这个查询的速度非常慢,加上 WordPress 不能缓存这个查询结果,当文章数量比较多的时候WordPress 的列表页打开速度会,因此可以禁止查询 SQL_CALC_FOUND_ROWS*,这样就可以禁止分页~
如果想要继续使用分页,可以用EXPLAIN 方式重构~
具体代码见下方,经过测试完美可用:
/*禁止查询 SQL_CALC_FOUND_ROWS*/
add_action('pre_get_posts', 'wndt_post_filter'); function wndt_post_filter($query) { if (is_admin() or !$query->is_main_query()) { return $query; } $query->set('no_found_rows', true); }
/*如果您还需要查询文章数,可以用EXPLAIN方法代替WordPress的SQL_CALC_FOUND_ROWS*/ if ( ! function_exists( 'zjck_set_no_found_rows' ) ) { /** * 设置WP_Query的 'no_found_rows' 属性为true,禁用SQL_CALC_FOUND_ROWS * * @param WP_Query $wp_query WP_Query实例 * @return void */ function zjck_set_no_found_rows(\WP_Query $wp_query) { $wp_query->set('no_found_rows', true); } } add_filter( 'pre_get_posts', 'zjck_set_no_found_rows', 10, 1 ); if ( ! function_exists( 'zjck_set_found_posts' ) ) { /** * 使用 EXPLAIN 方式重构 */ function zjck_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', 'zjck_set_found_posts', 10, 2 );
与 “WordPress” 有关内容推荐:
- wordpress速度慢,cpu 100%,内存爆,优化教程2
- wordpress负载总是100%?磁盘IO读写时不时超载?解决办法!
- wordpress数据库优化插件Advanced DB Cleaner PRO 3.2.1 下载+图文详细教学
- wordpress文章如何添加自定义字段内容?如何调用显示?
- WordPress 使用 Nginx 限制每个 IP 地址访问 URL 的频率
- wordpress用2核服务器适合什么版本的数据库?
- wordpress主题制作教程,小白亲自一步步探索学习的记录
- wordpress利用WP Super Cache将静态页写入内存,大幅提高运行效率!
- WordPress数据库缓存插件Redis Object Cache Pro v1.17.0 下载
- wordpress无插件实现静态缓存文件提高访问速度
0