我有以下查詢在社交網絡上運行。該查詢從數據庫中提取帖子(如Facebook帖子)。使用ORDER BY時MYSQL查詢非常慢datetime
SELECT P.*,
P.id_post id_p,
PM.meta_content video_title,
PM2.meta_content video_views,
PM3.meta_content racebooking_views,
Greatest(P.creation_date, Coalesce(Max(C.date), P.creation_date)) AS
last_activity,
P.creation_date creation_date,
(SELECT Count(*)
FROM likes
WHERE post_id = P.id_post
AND post_type = 'P')
likes_count,
(SELECT Count(*)
FROM likes L
WHERE post_id = P.id_post
AND post_type = 'P'
AND L.id_profile = 2796)
do_i_like
FROM posts P
LEFT JOIN comments C
ON P.id_post = C.post_id
AND C.post_type = 'P'
AND C.id_profile != P.id_profile
LEFT JOIN post_meta PM
ON PM.id_post = P.id_post
AND PM.meta_type = 'T'
LEFT JOIN post_meta PM2
ON PM2.id_post = P.id_post
AND PM2.meta_type = 'V'
LEFT JOIN post_meta PM3
ON PM3.id_post = P.id_post
AND PM3.meta_type = 'W'
GROUP BY P.id_post
ORDER BY last_activity DESC
LIMIT 41, 10
每篇文章可能有或沒有評論。 我希望查詢先獲取最近活動的帖子。 因此,如果該帖子有評論,我會記下最新評論的日期。如果該帖子沒有評論,我將發佈該帖子的創建日期。
這項工作是由Greatest(P.creation_date, Coalesce(Max(C.date), P.creation_date))
完成的,它在評論日期(如果存在評論)和帖子創建日期之間選取greates值。
然後,ORDER BY last_activity DESC
做排序工作。
問題
查詢實在是太慢了。它需要8秒鐘才能運行。 posts表有8K行,comments表有8K行。
我不明白的是,如果我用這個ORDER BY P.id_post
替換ORDER BY子句,它需要0.5秒的時間來運行。但是,如果我再次用ORDER BY P.creation_date
替換ORDER BY子句,則需要8秒。它似乎不喜歡日期...
其他相關信息
- 職位表上CREATION_DATE的索引。
- 意見表上的日期索引
- 服務器上的CentOS Linux上運行LAMP 6.6
- 我嘗試過其他的解決方案上SO like this one但他們沒有工作
我怎樣才能解決這個查詢運行更快?
你嘗試創建列的索引'CREATION_DATE '? –
@餘加瑤在問題中,我寫了「posts table有一個關於creation_date的索引」。你是指那個還是別的? –
您使用'last_activity'組,但是last_activity是動態生成的,我認爲這樣的索引在這種情況下不起作用,可能將'last_activity'添加爲posts表的列? –