我正在为客户提取和显示Wordpress数据库中的数据到移动应用程序,我在改进此查询时遇到一些麻烦。
在wordpress中,有三个表链接我需要访问的数据 1. wp_posts - 在此表中有主要帖子标题,它的发布状态和帖子类型。 2. wp_postmeta - 此表包含与上表中的帖子ID相关的所有补充信息。 3. wp_p2p - 此表包含指向所有父子帖子及其关系的链接。
由于这些表中的数据量很大,我目前的查询大约需要13秒才能运行,请您查看一下这个sqlfiddle,让我知道我可以看一下如何改进它?它当前形式的查询不是最终结果,但改进它将改善我的最终结果。我还需要在wp_postmeta表中的“name”上添加一个搜索字段。
http://sqlfiddle.com/#!2/0e9e0/1
感谢任何方向,谢谢!
答案 0 :(得分: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表中不存在的位置,以便该部分比您当前正在执行此操作的速度快得多。您似乎也可以删除JOIN
上的wp_postmeta
,因为您根本不使用它。删除JOIN
也会使GROUP BY
多余并删除它可能会有助于提高性能。删除GROUP BY
也是一种很好的做法,因为严格来说,您不能选择GROUP BY
子句中不包含的非聚合字段,但MySQL提供此功能以便查询仍将以任何方式工作。
答案 1 :(得分: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。此列是否没有唯一值?