Mysql: 8.0.29
数据量:628W条
主键字段:id
一、Mysql分页原理
示例语句: SELECT * FROM test_logistics_contract_info LIMIT 5000000,10;
PS1:理论上生产环境不禁止SELECT * ,哪怕会用到所有的字段,这里只是示例语句。
执行原理 :
先执行 SELECT * FROM test_logistics_contract_info LIMIT 5000010;放入Mysql内存中
再取最后的10条返回
效率:
分页越深,效率越低,如果取全表的最后10条,相当于全表扫描。
二、俩种SQL语句级别优化和效率对比
原版语句: 执行时间 7.338秒
优化语句一: 查询时间 0.143秒 比原版的零头还低
SELECT a.* FROM test_logistics_contract_info a INNER JOIN (SELECT id FROM test_logistics_contract_info LIMIT 500000,10) as b
on a.id = b.id
原理:利用 InnoDB 的回表机制,先拿所需要数据的主键,再用主键拿数据。
优化二:查询时间 0.0秒(纳秒级别了) 比原版的零头的零头还低
SELECT * FROM test_logistics_contract_info WHERE id >= 5066186 LIMIT 10;
原理:先拿到上次分页的最后一条数据id,然后用id精准定位数据的位置。
缺点:禁止跳页,每次都必须拿到上一页的最后一条数据的id
PS2:Mysql自增主键具有不连续性,用页数*每页条数得到的数字作为id是不准确的(比如物理删除的数据,或者批量添加数据)
PS3:Mysql还有唯一索引不唯一的特性( ^_^!!)
三、其他优化方式
1、禁止深分页(使用多)
某东、某宝的分页都限定了100页
2、用适合大数据分页的DB 存数据 (省心)
比如es(GB~TB级别) Hbase(PB级别)