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 或 category_id 的索引吗?它会进行全表扫描,因为您在搜索字段上没有索引。除了发回数据(在执行阶段之后)之外,具有限制的查询需要几乎相同的时间。

于 2013-03-27T16:02:45.750 回答
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。转到下一个呼叫。

于 2013-03-27T16:08:41.273 回答
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 列上创建索引以加快查询过程

CREATE INDEX indexName ON phorum_messages (parent_id);
于 2013-03-27T16:01:23.700 回答