0

phpbb3から最近の5つの投稿/トピックを取得するために実行されるこのクエリがあります。フォーラムには180,000を超えるレコードがあります。この現在のクエリは、完了するまでに平均20秒かかります。高速化するために最適化する方法はありますか?

SELECT t.topic_id, t.topic_title, t.topic_last_post_id, t.forum_id, p.post_id, p.poster_id, p.post_time, u.user_id, u.username
FROM phpbb_topics t, phpbb_forums f, phpbb_posts p, phpbb_users u
WHERE t.topic_id = p.topic_id AND
f.forum_id = t.forum_id AND
t.forum_id != 4 AND
t.topic_status <> 2 AND
p.post_id = t.topic_last_post_id AND
p.poster_id = u.user_id
ORDER BY p.post_id DESC LIMIT 5;
4

2 に答える 2

1

まず、このt.topic_id = p.topic_id節はすでに によって暗示されているため、冗長であると思いますp.post_id = t.topic_last_post_id。したがって、この簡略化されたバージョンを試してください。

SELECT
    t.topic_id,
    t.topic_title,
    t.topic_last_post_id,
    t.forum_id,
    p.post_id,
    p.poster_id,
    p.post_time,
    u.user_id,
    u.username
FROM phpbb_forums f
JOIN phpbb_topics t ON f.forum_id = t.forum_id
JOIN phpbb_posts p ON t.topic_id = p.topic_id
JOIN phpbb_users u ON p.poster_id = u.user_id
WHERE
    t.forum_id != 4 AND
    t.topic_status != 2
ORDER BY p.post_id DESC LIMIT 5;

f.forum_id2 番目に (これが速度低下の原因である可能性があります) 、次の列にインデックスがあることを確認t.forum_idt.topic_idます: p.topic_id、、、、、および。p.poster_idu.user_idt.topic_status

(<> と != は同等です)

于 2013-03-08T04:58:53.137 に答える
0

おそらく、いくつかのインデックスをテーブルに追加する必要があります。

コマンドについて学ぶことができるこの記事をお読みくださいEXPLAIN。これにより、クエリのボトルネックがどこにあるかを確認でき、作成する必要があるインデックスを確認できます。

たとえば、JOIN2 つのテーブル間に を作成する場合、両方のフィールドにインデックスがあることを確認する必要があります。そうしないと、MySQL はテーブルの交差を管理するために追加の作業を行う必要があります。また、行の順序付けに使用するフィールドのインデックスを作成することをお勧めします (まだ作成していない場合ORDER BY p.post_id)。結果とこれにも時間がかかります。

これがお役に立てば幸いです

于 2013-03-08T04:51:28.660 に答える