---
title: "加快 WP_Query 和 query_posts 函数提速"
url: "https://yjyj.net/learn/wordpress-learn/5927.html"
author: "小 虾 (生猛大蝦编辑部)"
published_at: "2018-03-10T23:30:49+08:00"
updated_at: "2018-03-10T23:30:49+08:00"
categories: "WordPress 学习"
tags: "MySQL数据库, query_posts, WordPress优化, WordPress开发, wp_query"
summary: "本文聚焦 WordPress 查询变慢的常见元凶：WP_Query 和 query_posts 默认触发大量 SQL_CALC_FOUND_ROWS，数据库往往难以缓存，拖慢列表页与日志查询。通过开启 no_found_rows 参数，可直接跳过这类统计查询，明显提升性能；同时说明 get_posts 默认已帮你设好，"
source: "生猛大蝦 (https://yjyj.net)"
---

# 加快 WP_Query 和 query_posts 函数提速

> 来源：[生猛大蝦 (yjyj.net)](https://yjyj.net/learn/wordpress-learn/5927.html) · 作者：小 虾 · 发布时间：2018-03-10

## 30 秒核心看点 (TL;DR)

- 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 查询，比如： 

```
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，才需要留意是否显式开启这个参数，避免无谓的统计开销。

---
更多 Linux 运维、WordPress 性能优化、前端工程化、Shopify 独立站与极客折腾指南：[生猛大蝦全站文章归档 (https://yjyj.net/archive)](https://yjyj.net/archive)
