# 加快 WP_Query 和 query_posts 函数提速

- Link: https://yjyj.net/learn/wordpress-learn/5927.html
- Published: 2018-03-10T23:30:49+08:00
- Author: 小 虾

⚡ 生猛大蝦编辑部 · 30 秒核心看点

 * WP_Query 和 query_posts 可能额外生成 SQL_CALC_FOUND_ROWS，拖慢查询速度。
 * 给查询加上 no_found_rows=true，可减少不必要的统计 SQL，提速很直接。
 * get_posts 默认已开启 no_found_rows，做轻量查询时更省心。

我们在使用 WP_Query 或者 query_posts 进行日志查询的时候，WordPress 都会产生很多 
SQL_CALC_FOUND_ROWS 的 SQL 查询。

一般来说这类 SQL 查询，数据库是不会进行缓存。

WP_Query 和 query_posts 其实提供了 no_found_rows 参数可以阻止进行这类的 SQL 查询，
比如：

    ```decode:true
    query_posts('no_found_rows=true&cat=1&numberposts=1');
    ```

另外说一下：get_posts 函数自动设置了这个参数为 true

感谢水煮鱼大哥：
 http://blog.wpjam.com/m/speed-up-wordpress-wp_query-and-query_posts-
functions/

📌 生猛大蝦编辑部 · 背景与实操延伸

这篇文章虽然短，但抓住了 WordPress 查询性能里很典型的一个坑：很多人只盯着模板和缓
存，却忽略了查询本身的统计开销。实操时要注意，no_found_rows 适合不需要分页总数的
场景；如果你后面还要做页码、总数展示，就不能一刀切关闭。建议先在列表页、归档页和
自定义查询里逐个排查，再看数据库慢查询日志验证效果。

❓ 延伸问答与排错指南（FAQ）

WP_Query 为什么会变慢？

常见原因是它会额外执行 SQL_CALC_FOUND_ROWS 相关查询，用来统计总数和分页信息。这类
SQL 往往不易被数据库缓存，查询量一大就会拖慢页面响应，尤其是列表页和日志页更明显。

no_found_rows 参数怎么用？

在 WP_Query 或 query_posts 的参数里加入 no_found_rows=true 即可，表示不需要总数统计，
直接跳过相关 SQL。适合不需要分页总数、只取少量数据的场景，能减少数据库负担。

get_posts 还需要手动优化吗？

一般不需要。get_posts 默认已经把 no_found_rows 设为 true，适合做轻量内容获取。如果
你改用 WP_Query 或 query_posts，才需要留意是否显式开启这个参数，避免无谓的统计开销。

📚 【[WordPress 学习](https://yjyj.net/category/learn/wordpress-learn)】专栏延伸
阅读与热门精选（[全站文章归档](https://yjyj.net/archive)）：

 * [WordPress 常用模板函数](https://yjyj.net/learn/wordpress-learn/5900.html)
 * [获取wordpress 当前栏目名,当前栏目的分类名](https://yjyj.net/learn/wordpress-learn/5893.html)
 * [给wordpress启用SSL](https://yjyj.net/learn/wordpress-learn/5989.html)
 * [记录一处宝塔配置导致的wordpress 502错误](https://yjyj.net/learn/wordpress-learn/6120.html)
 * 热门必读[Shopify Sessions 数据维度表](https://yjyj.net/learn/shopify/7764.html)
 * 热门必读[解决: windows 环境下 无法将“git”项识别为 cmdlet、函数、脚本文件或可运行程序的名称](https://yjyj.net/learn/7776.html)
