[英]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.