这个MySQL查询是否有更有效的解决方案?

时间:2013-02-12 18:39:11

标签: mysql

我正在为客户提取和显示Wordpress数据库中的数据到移动应用程序,我在改进此查询时遇到一些麻烦。

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

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

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

感谢任何方向,谢谢!

2 个答案:

答案 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。此列是否没有唯一值?