首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MySql使用SUM() of results连接速度很慢

MySql使用SUM() of results连接速度很慢
EN

Stack Overflow用户
提问于 2018-06-25 14:46:46
回答 1查看 165关注 0票数 0

有人知道执行这个查询的更有效的方法吗?

代码语言:javascript
复制
SELECT SQL_CALC_FOUND_ROWS p.*, IFNULL(SUM(v.visits),0) AS visits,
FROM posts AS p 

LEFT JOIN visits_day v ON v.post_id=p.post_id 

GROUP BY post_id 
ORDER BY post_id DESC LIMIT 20 OFFSET 0

visits_day表每天、每个用户、每个帖子都有一条记录。随着表的增长,这个查询非常慢。

我不能添加一个总访问计数的列,因为我需要列出每天或每周更多的访问等帖子。

有没有人知道更好的解决方案?

谢谢

代码语言:javascript
复制
CREATE TABLE `visits_day` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `post_id` int(11) NOT NULL,
 `user_id` int(11) NOT NULL,
 `day` date NOT NULL,
 `visits` int(11) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=52302 DEFAULT CHARSET=utf8

CREATE TABLE `posts` (
 `post_id` int(11) NOT NULL AUTO_INCREMENT,
 `link` varchar(300) NOT NULL,
 `date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
 `title` varchar(500) NOT NULL,
 `img` varchar(300) NOT NULL,
 PRIMARY KEY (`post_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1027 DEFAULT CHARSET=utf8
EN

回答 1

Stack Overflow用户

发布于 2018-06-26 03:36:50

使用SQL_CALC_FOUND_ROWS,查询必须计算所有内容,只是不能提交所有行。摆脱这一点应该是有益的。

要真正触及20行,我们需要用一个索引遍历WHEREGROUP BYORDER BY。否则,我们可能不得不触摸所有行,对它们进行排序,然后传递20。显而易见的索引是(post_id);我怀疑它已经被索引为PRIMARY KEY(post_id)?(如果您在提问时提供SHOW CREATE TABLE,则会有所帮助。)

执行连接的另一种方法是获得所需的零结果,如下所示。注意,它消除了对GROUP BY的需要。

代码语言:javascript
复制
SELECT p.*,
       IFNULL( ( SELECT SUM(v.visits)
                   FROM visits_day
                   WHERE post_id = p.post_id
               ),
            0) AS visits
    FROM posts AS p 
    ORDER BY post_id DESC
    LIMIT 20 OFFSET 0

如果您确实需要计数,那么可以考虑使用SELECT COUNT(*) FROM posts

在您的查询中使用ON v.post_id=p.post_id,并在visits_day上使用WHERE post_id = p.post_id beg表示INDEX(post_id)。这将大大提高这两种变体的速度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51017678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档