動作するクエリがありますが、実行に少なくとも 3 秒かかるため、おそらく高速になると思います。新しいスレッドのリストを作成し、各スレッドに未読の投稿がいくつあるかを表示するために使用されます。に投げる前にクエリ文字列を生成します$db->query_read()
。有効なフォーラムからのみ結果を取得するために$ids
、カンマで区切られた最大 50 個の値の文字列です。
userthreadviews
テーブルは 1 週間存在し、約 9,500 行あります。1 週間以上前のスレッド ビューを定期的にクリアするために cron ジョブを設定する必要があるのか、それともそれを成長させても問題ないのかはわかりません。
現在のクエリは次のとおりです。
SELECT
`thread`.`title` AS 'r_title',
`thread`.`threadid` AS 'r_threadid',
`thread`.`forumid` AS 'r_forumid',
`thread`.`lastposter` AS 'r_lastposter',
`thread`.`lastposterid` AS 'r_lastposterid',
`forum`.`title` AS 'f_title',
`thread`.`replycount` AS 'r_replycount',
`thread`.`lastpost` AS 'r_lastpost',
`userthreadviews`.`replycount` AS 'u_replycount',
`userthreadviews`.`id` AS 'u_id',
`thread`.`postusername` AS 'r_postusername',
`thread`.`postuserid` AS 'r_postuserid'
FROM
`thread`
INNER JOIN
`forum`
ON (`thread`.`forumid` = `forum`.`forumid`)
LEFT JOIN
(`userthreadviews`)
ON (`thread`.`threadid` = `userthreadviews`.`threadid`
AND `userthreadviews`.`userid`=$userid)
WHERE
`thread`.`forumid` IN($ids)
AND `thread`.`visible`=1
AND `thread`.`lastpost`> time() - 604800
ORDER BY `thread`.`lastpost` DESC LIMIT 0, 30
テーブルを結合する代替クエリpost
(ユーザーが投稿したスレッドのみを表示する) は、実際には 2 倍高速であるため、速度を上げるために変更できるものがここにあると思います。誰かアドバイスをいただけますか?
編集:申し訳ありませんが、代替クエリの前に EXPLAIN を配置しました。正しい出力は次のとおりです。要求どおり、EXPLAIN SELECT によって生成された出力は次のとおりです。