🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
分页算法: limit (页码-1)*长度,长度; 开启profile机制,获取查询时间 查看是否开启profiling功能 ~~~ SHOW VARIABLES LIKE '%pro%'; 或者 SELECT @@profiling; ~~~ 开启 ~~~ SET profiling=1; ~~~ # 问题 show profiles; +----------+------------+---------------------------------------+ | Query_ID | Duration | Query | +----------+------------+---------------------------------------+ | 1 | 0.00018700 | select * from yaboo limit 1,10 | | 2 | 0.00050400 | select * from yaboo limit 1000,10 | | 3 | 0.00344900 | select * from yaboo limit 10000,10 | | 4 | 0.04172900 | select * from yaboo limit 100000,10 | | 5 | 0.29384700 | select * from yaboo limit 1000000,10 | | 6 | 2.88306300 | select * from yaboo limit 10000000,10 | +----------+------------+---------------------------------------+ 因此:limit offset,N 当offset非常大时,效率极低 # 原因 mysql并不是跳过offset行,然后单取N行。而是取offset+N行,放弃前offset行,返回N行。效率较低,当offset越大是,效率越低 ![](https://box.kancloud.cn/16d1606a47bf10189663e0fbe61081fa_908x131.jpg) # 办法 优化办法: (1)从业务上去解决: 办法:不允许翻过100页, 以百度为例,一般翻页到70页左右,谷歌40页左右。 (2)不用offset,用条件查询: 通过 `where+order+limit` 取代` order+limit` 偏移量,长度 ~~~ select from user order by id limit 偏移量,长度 select from user where id >偏移量 order by id limit 长度 ~~~ +----------+------------+------------------------------------------------+ | Query_ID | Duration | Query | +----------+------------+------------------------------------------------+ | 1 | 0.00018700 | select * from yaboo limit 1,10 | | 2 | 0.00050400 | select * from yaboo limit 1000,10 | | 3 | 0.00344900 | select * from yaboo limit 10000,10 | | 4 | 0.04172900 | select * from yaboo limit 100000,10 | | 5 | 0.29384700 | select * from yaboo limit 1000000,10 | | 6 | 2.88306300 | select * from yaboo limit 10000000,10 | | 8 | 0.00632600 | select * from yaboo where id>10000000 order by id limit 10 | +----------+------------+------------------------------------------------+ where+order+limit获得相同结果的数据情况下,有索引可以使用,为什么呢? 因为如下图,where+order+limit值获得指定区域的有限的记录条数,比较少,因此可以使用索引 ![](https://box.kancloud.cn/1d087533f6039e08ab2ec45679520962_918x150.jpg) # 注意: where+order+limit的问题 通过where+order+limit实现数据获取的注意: ① 排序的字段最好是**从1开始**,并且是**连续自增**的,这样方便where计算并获得指定的数据信息 ② 一般使用次数较少 --- ![](https://box.kancloud.cn/39d20eba594039b13c6071f4081946af_1360x246.jpg) ![](https://box.kancloud.cn/68da43f5a5bc2af86da2ca35b0ffea10_2428x293.jpg) ![](https://box.kancloud.cn/3366bd98972127d64bffef29b59b8e66_2332x318.jpg) 避免数据量多扫描过多