2012-02-23 41 views
0

Mysql的索引的情况我有2个表与DISTINCT

第一种是主题是持有

二是这里的消息都保持。我想为我的项目制作最新主题模组。其目的列出最近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! 

我希望你明白我的例子是我必须做的:/

是我迄今所做的就是这个代码通过搜索计算器:

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可能会有一个或多个消息。因此,查询可以选择相同的主题两次或更多..我只是希望它选择一次上市..

任何人都可以帮助我与此查询的性能?或者如果你有更好的查询上市,如我告诉请分享:/我有点新手

回答

0

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

你可以做到这一点

SELECT * 
FROM topics 
ORDER BY last_message_at DESC 
LIMIT 30; 

应工作非常快,如果指数last_message_at。在这里,您为了读取效率而交易一些写入性能我假设你的用户阅读的不仅仅是写作。

+0

它是一个国际日期变更线的列? – 2012-02-23 17:09:06

+0

哦,我很抱歉,我读取日期作为数据:) – 2012-02-23 17:09:49

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;