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;