Mysql索引情况与不同
我有两张桌子 首先是主题所在的位置 第二个是保存消息的位置Mysql索引情况与不同,mysql,performance,distinct,Mysql,Performance,Distinct,我有两张桌子 首先是主题所在的位置 第二个是保存消息的位置 我想为我的项目制作一个最近的主题模型。其目的是列出最近的30个主题 关键是我可以很容易地打电话给你 "select * from topics order by date desc limit 30;" 但是我不想只列出最近的30个主题,我想列出通过消息更新最近的30个主题 好吧,让我举个例子告诉你我在想什么!: 假设有5个主题,它们都是最新的 *Hello Whats UP? *Good Morning *Good Afterno
我想为我的项目制作一个最近的主题模型。其目的是列出最近的30个主题 关键是我可以很容易地打电话给你
"select * from topics order by date desc limit 30;"
但是我不想只列出最近的30个主题,我想列出通过消息更新最近的30个主题
好吧,让我举个例子告诉你我在想什么!:强>
假设有5个主题,它们都是最新的
*Hello Whats UP?
*Good Morning
*Good Afternoon
*Hello Nice!
*There is a Bear behind you!
我写了一条关于“你身后有一只熊”的信息。名单必须是
更新至
*There is a Bear behind you!
*Hello Whats UP?
*Good Morning
*Good Afternoon
*Hello Nice!
我希望你能理解我所做的事情的例子:/
到目前为止,我通过搜索stackoverflow完成了以下代码:
SELECT DISTINCT a.* FROM topics a LEFT JOIN messages b ON a.id = b.topic_id ORDER BY b.date DESC LIMIT 30;
这个查询很有魅力,但是我的主题和消息表太大了!
这就是解释
+----+-------------+-------+------+---------------+------+---------+-------------------+--------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+-------------------+--------+---------------------------------+
| 1 | SIMPLE | a | ALL | NULL | NULL | NULL | NULL | 383056 | Using temporary; Using filesort |
| 1 | SIMPLE | b | ref | sira,sira_2 | sira | 4 | avare_sozluk.a.id | 6 | Distinct |
+----+-------------+-------+------+---------------+------+---------+-------------------+--------+---------------------------------+
哦!!顺便说一句,我使用了Distinct,因为可能会有一条或多条消息。因此,查询可以选择同一主题两次或多次。。我只想让它选择一次来登录
有人可以帮助我执行此查询吗?或者,如果您对列表有更好的查询,如我所说的,请共享:/i是一个新手一个简单的解决方法是在主题表中添加另一列-
最后一条消息
,它将包含最后一条消息的日期。您将在发布消息时更新此字段
现在你可以这样做了
SELECT *
FROM topics
ORDER BY last_message_at DESC
LIMIT 30;
如果您在处为
最后一条消息编制索引,应该可以非常快速地工作。在这里,您可以用一些写性能来换取读效率。我假设您的用户读的比写的多。您可以使用MAX函数
SELECT DISTINCT a.* FROM topics a LEFT JOIN messages b ON a.id = b.topic_id ORDER BY MAX(b.date) DESC LIMIT 30;