0

我正在为客户从 Wordpress 数据库中提取数据并将其显示到移动应用程序中,但在优化此查询以使其最有效时遇到了一些麻烦。

在 wordpress 中,有三个表链接我需要访问的数据 1. wp_posts - 在此表中有主要帖子标题、发布状态和帖子类型。2. wp_postmeta - 此表包含与上表中的帖子 ID 相关的所有补充信息。3. wp_p2p - 此表包含所有父子帖子及其关系的链接。

由于这些表中的数据量很大,我目前的查询大约需要 13 秒才能运行,请你看看这个 sqlfiddle,让我知道我可以改进它吗?当前形式的查询不是最终结果,但改进它会改善我的最终结果。我还需要在 wp_postmeta 表中的“名称”上添加一个搜索字段。

http://sqlfiddle.com/#!2/0e9e0/1

任何方向表示赞赏,谢谢!

4

2 回答 2

1

如果我理解正确,您正在寻找只有子帖子,在这种情况下,下面的查询应该更快:

SELECT wp_posts.id,  post_title, post_status, post_type
FROM wp_posts
JOIN wp_postmeta ON (wp_posts.id = wp_postmeta.post_id)
LEFT JOIN wp_p2p ON (wp_posts.id = wp_p2p.p2p_from)
WHERE `post_status`='publish' AND `post_type`='merchant' 
AND wp_p2p.p2p_from IS NULL
GROUP BY wp_posts.id

此查询将被优化以查找 p2p 表中不存在匹配项的位置,因此该部分将比您当前执行的操作要快得多。看起来您也可以删除JOINonwp_postmeta因为您根本不使用它。删除它JOIN也会使GROUP BY冗余和删除它可以对性能有所帮助。删除GROUP BY也是一个很好的做法,因为严格来说,您不能选择不在GROUP BY子句中的非聚合字段,但 MySQL 提供了此功能,因此查询仍然可以以任何方式工作。

于 2013-02-12T20:00:00.137 回答
0

首先,您应该使用 INNER 或 OUTER JOIN 语法连接表。所以:

FROM wp_posts INNER JOIN wp_postmeta ON wp_posts.id = wp_postmeta.post_id

或者也许你想要一个 OUTER JOIN 这里?

您能解释一下为什么要在 wp_posts.id 上进行 GROUP BY。此列是否没有唯一值?

于 2013-02-12T18:49:10.947 回答