【问题标题】:Getting Popular Topics on a Custom Made Forum在定制论坛上获取热门话题
【发布时间】:2010-06-09 07:04:28
【问题描述】:

对于我们正在开发的这个网站,我们正在努力获取最热门的主题(基于过去 24 小时内发布的帖子数量)。我们有一个大中型论坛,当前的 MySQL 查询如下所示:

SELECT `forums_topics`.`id`,`forums_topics`.`name`,
    (
        SELECT COUNT(`id`)
        FROM `forums_posts`
        WHERE `postdate` > (UNIX_TIMESTAMP()-60*60*24)
        AND `topicid`=`forums_topics`.`id`
    ) AS `trendy_threads`
    FROM `forums_topics`
    WHERE `deleted`=0
    AND `lastpost` > (UNIX_TIMESTAMP()-60*60*24)
    ORDER BY `trendy_threads` DESC,`postdate` DESC
    LIMIT 3

SQL 很慢。

我们如何才能尽可能快速有效地获取这些信息?

forums_topics

Field   Type    Null    Key Default Extra
id  int(50) NO  PRI NULL    auto_increment
uid varchar(255)    NO      NULL     
flag    int(1)  NO      0    
boardid varchar(255)    NO      NULL     
postdate    varchar(255)    NO      NULL     
lastpost    bigint(255) NO      NULL     
name    varchar(50) NO      NULL     
description text    NO      NULL     
body    text    NO      NULL     
author  varchar(25) NO      NULL     
deleted tinyint(3) unsigned NO      0    
deletememberid  int(10) unsigned    NO      0    
pinned  tinyint(1)  NO      0    
flagged text    NO      NULL     
privateaccess   text    NO      NULL     
lastposter  int(255)    NO      1    
replycount  int(255)    NO      0    
viewcount   int(255)    NO      0    
movedfrom   int(255)    NO      0     

forums_posts

Field   Type    Null    Key Default Extra
id  int(50) NO  PRI NULL    auto_increment
topicid int(10) unsigned    NO      0    
author  varchar(25) NO      NULL     
postdate    varchar(255)    NO      NULL     
body    text    NO      NULL     
lastedit    varchar(255)    NO      NULL     
postcount   tinyint(1)  NO      NULL     
invincible  tinyint(1)  NO      0    
deleted tinyint(3) unsigned NO      0    
deletememberid  int(10) unsigned    NO      0    
thumbsup    int(255)    NO      0    
thumbsdown  int(255)    NO      0    
thumbsupuser    text    NO      NULL     
thumbsdownuser  text    NO      NULL     

【问题讨论】:

  • 你能把EXPLAIN {the query you posted}的输出贴出来吗?
  • 如果我对查询运行 EXPLAIN,MySQL 不会返回任何内容......奇怪的是......

标签: php sql mysql forum


【解决方案1】:

问题可能是 MySQL 评估每一行的子查询。您可以通过将子查询移动到连接中来提示 MySQL 它应该只执行一次子查询:

SELECT  *
FROM    forum_topics ft
JOIN    (
            SELECT  topicid
            ,       COUNT(*) as cnt
            FROM    forums_posts
            WHERE   postdate > UNIX_TIMESTAMP()-60*60*24
            GROUP BY 
                    topicid
        ) fpc
ON      ft.topicid = fpc.topicid
WHERE   ft.deleted = 0
ORDER BY 
        fpc.cnt DESC
,       ft.postdate DESC
LIMIT 3

forum_posts(postdate, topicid) 上的索引将进一步提高性能。

【讨论】:

  • 哇,谢谢。对我的数据库进行了一些小的编辑,但它运行得非常快。我肯定还有很多关于 SQL 的知识需要学习。
【解决方案2】:

我将在黑暗中试一试,如果需要,我会进一步编辑。 EXPLAIN 查询会有所帮助。

SELECT `forums_topics`.*
FROM (
    SELECT `topicid`, COUNT(*) as num
    FROM `forums_posts` 
    WHERE `postdate` > (UNIX_TIMESTAMP()-60*60*24) 
    GROUP BY `topicid`
    ORDER BY num DESC, `postdate` DESC
    LIMIT 3
) `trendy`
LEFT JOIN `forums_topics` ON `id`=`topicid`
WHERE `deleted`=0

【讨论】:

  • 添加了一些描述并更改了起始 SQL 查询。
  • @Navarr - 很酷,我很高兴你明白了。
猜你喜欢
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 2019-06-15
  • 2019-11-02
  • 1970-01-01
相关资源
最近更新 更多