2

次のMysqlクエリがあります。これは低速のクエリであり、完了するまでに約 3 秒かかります。message_id は主キーです。これの問題は、高い LIMIT オフセットLIMIT 85075, 25です。

SELECT * FROM `phorum_messages` WHERE 1  and `catergory` >=0 and parent_id=0   order by `message_id` desc  LIMIT 85075, 25;

この解決策に基づいて、クエリを次のように変更しました。問題は、を削除するwhere parent_id=0と、速度がはるかに速くなることです。しかし、私は本当に必要ですwhere parent_id=0

編集:私はすでにparent_idとmessage_idのインデックスを作成しました.

助言がありますか?前もって感謝します。

SELECT  t.*
FROM    (
        SELECT  message_id
        FROM    phorum_messages where parent_id=0
        ORDER BY message_id desc LIMIT 85075, 25
        ) q
JOIN    phorum_messages t
ON      t.message_id = q.message_id
4

4 に答える 4

0

に複合インデックスを作成し、(parent_id, message_id)クエリを少し書き直します。

SELECT  t.*
FROM    (
        SELECT  message_id
        FROM    phorum_messages
        WHERE   parent_id = 0
        ORDER BY
                parent_id DESC, message_id DESC
        LIMIT   85075, 25
        ) q
JOIN    phorum_messages t
ON      t.message_id = q.message_id
于 2013-03-27T17:06:14.640 に答える
0

parent_id または category_id にインデックスはありますか? 検索フィールドにインデックスがないため、テーブル全体のスキャンを実行します。制限のあるクエリは、データの返送(実行フェーズの後に来る)を除いて、ほぼ同じ時間がかかります。

于 2013-03-27T16:02:45.750 に答える
0

クエリ プロセスを高速化するために、parent_id 列にインデックスを作成できます。

CREATE INDEX indexName ON phorum_messages (parent_id);
于 2013-03-27T16:01:23.700 に答える
0

大きな LIMIT オフセットを使用する場合、LIMIT オフセットを使用しない別のアプローチを使用するとよい場合があります。

最初のクエリの使用

SELECT * FROM `phorum_messages`
WHERE `catergory` >=0 and parent_id=0 
order by `message_id` desc 
LIMIT 25

最小の message_id を $min_id として保存します

next_call: その後、呼び出すことができます

SELECT * FROM `phorum_messages`
WHERE `catergory` >=0 and parent_id=0  AND message_id < $min_id
order by `message_id` desc 
LIMIT 25

次の 25 件の結果を取得します。$min_id を、結果セットから取得した最小の message_id に設定します。next_call に移動します。

于 2013-03-27T16:08:41.273 に答える