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