簡體   English   中英

使用DISTINCT的MySQL索引情況

[英]Mysql indexing situation with DISTINCT

我有2張桌子

首先是舉辦主題的地方

第二個是存放消息的地方。


我想為我的項目制作一個“最近主題”模塊。 其目的是列出最近的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表示可能會有一個或多個消息。 因此查詢可以選擇同一主題兩次或更多次。.我只希望它選擇一次即可列出。

任何人都可以幫助我執行此查詢嗎? 或者,如果您有更好的查詢清單,如我所說的,請分享:/我是一個新手

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

一個簡單的解決方法是在主題表中添加另一列last_message_at ,其中將包含最后一條消息的日期。 您將在發布消息時更新此字段。

現在您可以執行此操作

SELECT * 
FROM topics 
ORDER BY last_message_at DESC 
LIMIT 30;

如果您為last_message_at編制索引,應該可以很快地工作。 在這里,您為了獲得讀取效率而犧牲了一些寫入性能。 我認為您的用戶閱讀多於書寫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM