php - MySQL/PHP : Using multiple sub-queries in a query selecing multiple results, 这是一个坏主意吗?

标签 php mysql performance forum subquery

抱歉,如果标题有点……蹩脚。基本上我正在编写一个小型论坛,并使用多个子查询来选择论坛中的线程数、帖子数和最后一篇帖子的日期,同时抓取论坛的信息以显示在主页上!

这是我的问题,因为我不擅长解释事情:

SELECT `f`.*,
    (SELECT COUNT(`id`)
    FROM `forum_threads` 
    WHERE `forumId1` = `f`.`id1`
        AND `forumId2` = `f`.`id2`) AS `threadCount`,
    (SELECT COUNT(`id`)
    FROM `forum_posts` 
    WHERE `forumId1` = `f`.`id1`
        AND `forumId2` = `f`.`id2`) AS `postCount`,
    (SELECT `date`
    FROM `forum_posts` 
    WHERE `forumId1` = `f`.`id1` 
        AND `forumId2` = `f`.`id2` 
        ORDER BY `date` DESC LIMIT 1) AS `lastPostDate`
FROM `forum_forums` AS `f`
ORDER BY `f`.`position` ASC, `f`.`id1` ASC;

并且我使用通用的 foreach 循环来显示结果:

foreach($forums AS $forum) {
    echo $forum->name .'<br />';
    echo $forum->threadCount .'<br />';
    echo $forum->postCount .'<br />';
    echo $forum->lastPostDate .'<br />';
}

(当然不完全一样,但为了解释......)

现在我想知道这是否会对性能“不利”,或者是否有更好的方法?假设每个论坛中有相当多的帖子和主题。

我最初将“posts”、“threads”和“lastPost”列存储在论坛表本身中,并且每次有人创建新线程或帖子时都会增加(posts = posts + 1)这些值。虽然我也有这个想法,并且想知道它是否有好处。 :P

最佳答案

我会做一些不同的事情:

在我看来,所有这三个字段:threadCountpostCountlastPostDate都是可以在单独的表中维护的字段,比如forum_stats 仅包含 4 列:
* forum_id
* 线程数
* 帖子计数
* 最后发布日期

这些列可以通过更新。 trigger插入/更新时。
如果您在更新操作期间支付这么小的开销 - 您将获得对 select 的非常快速的查询(并且无论您拥有多少论坛/帖子/线程,它都将保持非常快的速度) .

另一种方法(不是我们好的TMO):
创建统计表并每天(或每隔几个小时)运行一次 batch-job这将更新统计数据。代价是您显示的数据永远不会是最新的,并且该作业可能需要资源,您可能只想在晚上运行该作业,例如,因为它很重并且您不希望它生效您网站的大多数访问者。

关于php - MySQL/PHP : Using multiple sub-queries in a query selecing multiple results, 这是一个坏主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12170846/

相关文章:

swift - 核心数据性能问题

performance - Elasticsearch:在同一分片上折叠文档是否会在折叠时提高性能?

javascript - 将 GET 查询复制到剪贴板

php - PCRE 库版本太旧

php - .htaccess 重写问题

mysql - 无法从本地主机连接到 MySQL 服务器,但 MySQL 服务正在运行

algorithm - 寻找多维优化算法

php - 使用带有ajax和formdata的codeigniter上传图像

php - joomla 下拉菜单中的几个月数据

mysql - SQL 按列中的数字排序