首页 > 解决方案 > 如何优化主页新闻提要上的 mysql 查询以获得快速结果?

问题描述

我有一个带有主页的网站,其中显示包含各种帖子的新闻提要,例如活动、聚会或任何文章。所以这些帖子根据帖子的类型存储在不同的 mysql 表中。现在,我只是从所有这些表(也有两到三个 JOINS)中一一获取数据,每个表 10 个帖子。但是现在由于我的数据增加了很多,所以由于所有的 JOINS,性能已经减慢。

那么有没有任何有效的方法来处理所有数据并在不减慢速度的情况下获取它们?大多数新闻网站如何在没有延迟的情况下运行?

我正在考虑在数据库中创建虚拟表,并将所有结果组合在一起(通过连接和联合)在一个表中。在获取时我所要做的就是从虚拟表中选择查询。那么我的想法是正确的还是有其他方法呢?

更新:样机查询:

select a.*, b.* from events as a
join users as b on a.userid = b.id
join groups as c on a.id = c.eventid
join likes as d on a.id = d.eventid
where a.created_at > [some-x-date]
and c.group IN (..,..,..)
group by a.id
order by a.created_at desc

来自其他 3 个表的 3 个这样的查询。即使使用索引,这也会造成滞后。请建议。

标签: mysqldatabasefeed

解决方案


虚拟表(或视图)将具有与运行查询本身完全相同(甚至可能稍差)的性能。

性能故障排除是一个很大的话题,如果没有看到您的任何代码(后端和 SQL),我们就无法猜测为什么这很慢。

我建议看一下;

1 - 如果结果不需要完全是最新的,则缓存结果

2 - 检查表上的索引以确保它们具有支持索引

3 - 正确检查与数据库的后端代码接口

发布查询后编辑:

好的,这里有很多问题;

select a.*, b.* from events as a
join users as b on a.userid = b.id
join groups as c on a.id = c.eventid
join likes as d on a.id = d.eventid
where a.created_at > [some-x-date]
and c.group IN (..,..,..)
group by a.id
order by a.created_at desc

您正在从 a 和 b 中选择所有字段,而且还按 a.id 分组 - 这对我来说真的没有意义......它也不允许有效地使用索引,因为所有字段都将被拉出。你真的需要所有的领域吗?为什么要使用 groupby?

a.userid、a.created_at 和 c.group 上是否有索引?


推荐阅读