在分页场景下,使用limit start end,我们分别看下从10000, 100000, 1000000开始分页的执行时间(每页取10条),如下图
当start较小时,查询没有性能问题,但是如上图查询时间所示,随着start增大,查询消耗时间也在递增,在start=10000000时,分页竟然消耗了2秒多,这是不能忍受的。
由此引出对limit分页的优化,首先来explain该语句,看到查询没有使用到任何的索引,进行的是全表扫描,假如limit分页用到了索引是不是会快很多呢!
explain分析一下,第一行是select * from user_innodb形成的临时表使用的是全表扫描,第二行是 (SELECT id FROM user_innodb LIMIT 10000000, 10)形成的,使用的是eq_ref,第三行是全表扫描a和bjoin形成的派生表,使用到的是index,所以速度也会快很多
使用子查询优化大数据量分页查询
这种方式的做法是先定位偏移位置的id,然后再往后查询,适用于id递增的情况。
使用id限定优化大数据量分页查询
使用这种方式需要先假设数据表的id是连续递增的,我们根据查询的页数和查询的记录数可以算出查询的id的范围,可以使用 id between and 来查询:
当然了,也可以使用in的方式来进行查询,这种方式经常用在多表关联的情况下,使用其他表查询的id集合来进行查询:
但是使用这种in查询方式的时候要注意的是,某些MySQL版本并不支持在in子句中使用limit子句。
参考 sql优化之大数据量分页查询(mysql) - yanggb - 博客园 (cnblogs.com)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)