私はソーシャルネットワーク上で実行される次のクエリを持っています。クエリは、データベースから投稿(Facebookの投稿など)を取得します。MYSQL ORDER BY日時を使用すると、クエリが非常に遅くなる
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
各投稿にはコメントがある場合とコメントがない場合があります。 最新のアクティビティが最初にある投稿を取得するクエリが必要です。 投稿にコメントがある場合は、最新のコメントの日付をとります。投稿にコメントがない場合、私は投稿の作成日を取る。
ジョブがコメントの日付の間greates値(コメントが存在する場合)とポストの作成日をピックアップGreatest(P.creation_date, Coalesce(Max(C.date), P.creation_date))
によって行われます。
その後、ORDER BY last_activity DESC
はソート仕事をしていません。
PROBLEM
クエリが本当に遅いです。実行には8秒かかります。投稿テーブルには8K個の行があり、コメントテーブルには8K個の行があります。私は理解していない何
は、私がこのORDER BY P.id_post
でORDER BY句を交換する場合、それは実行に0.5秒かかるということです。しかし、ORDER BY句をORDER BY P.creation_date
に置き換えると、8秒かかります。
追加に関する情報
- ポストテーブルはCREATION_DATEにインデックスを持っている...それは日付が好きではないようです。
- コメントテーブルは
- サーバーは、私はSO like this one上の他のソリューションを試みたが、彼らは私が実行するには、このクエリを修正することができますどのよう
を動作しませんでしたCentOSのLinuxの6.6
あなたは、列 'CREATION_DATEにインデックスを作成しようとしてください'? –
@YuJiaao質問では、私は "投稿テーブルはcreation_dateのインデックスを持っている"と書いています。あなたはそれか他の何かを意味しますか? –
'last_activity'でgroupを使用していますが、last_activityが動的に生成されています。そのような場合にインデックスが役立たないと思います。おそらく' last_activity'を投稿テーブルのカラムとして追加しますか? –