MYSQL更高的LIMIT偏移使查询变慢

时间:2013-03-27 15:57:55

标签: mysql sql-order-by limit mysql-slow-query-log

我有以下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;

基于this solution,我将查询更改为以下方式。问题是如果我删除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 个答案:

答案 0 :(得分:0)

您可以在parent_id列上创建索引以加快查询过程

CREATE INDEX indexName ON phorum_messages (parent_id);

答案 1 :(得分:0)

你有关于parent_id或category_id的索引吗?它执行全表扫描,因为搜索字段上没有索引。 除了向后发送数据(在执行阶段之后)之外,具有限制的查询所花费的时间几乎相同。

答案 2 :(得分: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。

答案 3 :(得分: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