使用DISTINCT进行Mysql索引的情况

时间:2012-02-23 17:03:28

标签: mysql performance distinct

我有两张桌子

首先是主题持有的地方

其次是消息被保留的地方。


我想为我的项目制作一个Recent Topics mod。其目的是列出最近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                        |
+----+-------------+-------+------+---------------+------+---------+-------------------+--------+---------------------------------+

OH!顺便说一句,我使用Distinct可能会有一条或多条消息。所以查询可以选择相同的主题两次或更多..我只是想让它选择一次列出..

任何人都可以帮我查询此查询的效果吗?或者如果你有更好的查询列表,就像我说的那样请分享:/我是新手

2 个答案:

答案 0 :(得分:0)

一个简单的解决方法是向主题表添加另一列 - last_message_at,其中包含最后一条消息的日期。您将在发布消息时更新此字段。

现在你可以这样做

SELECT * 
FROM topics 
ORDER BY last_message_at DESC 
LIMIT 30;

如果你索引last_message_at,应该可以很快地工作。在这里,您可以交换一些写入性能以实现读取我假设您的用户阅读的内容不仅仅是写作。

答案 1 :(得分:0)

您可以使用 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;