mysql我们分页都使用的是limit,但是limit有些不足之处
比如我现在有一张表
有五百万条数据。
SELECT * FROM t_homepage_worklog_jxh LIMIT 100,10;
执行上面的没问题,很快,但还是有必要说下的执行过程,他是相当于先遍历了前100条数据,然后取到100-110这十条数据。到这里问题就出来了,如果这个起始的值过大呢,比如我把他改成三百万,我要查三百万之后的十条数据。
花费8秒多,这肯定就不行了。 因为他需要先查询前面的三百万条数据
解决方案:
我们都知道主键id自带了索引,那么我们就需要利用到主键索引,
SELECT * FROM t_homepage_worklog_jxh
where id >=(select id from t_homepage_worklog_jxh limit 3000000,1) limit 10;
这样我们是通过主键索引快速定位到了我们需要分页查询的起始位置,然后用limit 方法获取了后面的10条数据,这样只需要一秒左右,效率大大提升。
还有一种类似,也是根据主键id索引,通过between and限制id的范围,直接查询
SELECT
*
FROM
t_homepage_worklog_jxh
WHERE
id BETWEEN ( SELECT id FROM t_homepage_worklog_jxh LIMIT 3000000, 1 )
AND ( SELECT id FROM t_homepage_worklog_jxh LIMIT 3000010, 1 );
时间大概也是一秒