mysql - 使用子查询加速 JOIN

标签 mysql

在 WordPress 数据库中,我想选择至少撰写了 5 篇文章的作者的所有已发表文章,并将作者的 ID 替换为他们的登录名。我通过选择所有已发布的帖子,使用 JOIN 语句过滤两次,其中一次加入子查询的结果集来获取那些发表超过五篇文章的作者,从而实现了这一目标。

这里我们使用代码:

SELECT posts.post_author, users.user_login, posts.post_content, posts.post_date
FROM zwzt_wp.zwzt_wp_posts AS posts 

INNER JOIN zwzt_wp.zwzt_wp_users AS users
ON posts.post_author=users.id

INNER JOIN (
    SELECT posts1.post_author, COUNT(*) AS count
    FROM zwzt_wp.zwzt_wp_posts AS posts1 
    WHERE posts1.post_type='post' AND posts1.post_status='publish'
    GROUP BY posts1.post_author
    HAVING count > 5
    ORDER BY posts1.post_author
) as regular_users
ON posts.post_author=regular_users.post_author

WHERE posts.post_type='post' AND posts.post_status='publish'
ORDER BY posts.post_author, posts.post_date DESC;

对我来说,这看起来有点臃肿且运行时间密集,特别是因为我在 posts 上运行了两个选择查询。有什么方法可以更有效地实现这一点吗?

最佳答案

我认为您无法做太多事情来简化查询。但是,您可以做一些事情:

  • 从子查询中删除 ORDER BY
  • zwzt_wp_posts(post_type, post_status, post_author) 上创建索引。
  • 确保您在 users(id) 上有索引。
  • 确保您在 zwzt_wp_posts(post_author) 上也有索引。

如果此类信息经常在查询中使用,您可能需要设置触发器来维护用户级别的计数。

关于mysql - 使用子查询加速 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38161017/

相关文章:

java - 从 MySQL DB 中选择后日期倒退一天

PHP/MYSQL 过期删除数据

php - 修改mysql数据库以提高效率

c++ - 将依赖项链接到静态库?

mysql - sql查找具有不同列值的行

php - MySQL 划分行并在新行上显示结果

mysql - 我怎样才能使我的 where 语句在这里工作?

c# - 即使一切正确,我也收到 C# SQL 连接错误

Mysql 喜欢在字符串末尾匹配模式

php - SQL 加入收藏夹列表返回错误的名称