合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
#### 分页算法 ~~~ limit (页码-1) * 条数 , 条数 ~~~ #### 测试 ~~~ +----------+------------+--------------------------------------+ | Query_ID | Duration | Query | +----------+------------+--------------------------------------+ | 1 | 0.00049325 | select * from user limit 1000 ,10 | | 2 | 0.03135925 | select * from user limit 100000 ,10 | | 3 | 0.25734325 | select * from user limit 1000000 ,10 | | 4 | 0.77315600 | select * from user limit 3000000 ,10 | +----------+------------+--------------------------------------+ ~~~ 因此:limit offset,N ; 当offset非常大时,效率极低 . 原因是:mysql并不是跳过offset行,然后单取N行。而是取offset+N行,放弃前offset行,返回N行。效率较低,当offset越大是,效率越低。 ![](https://box.kancloud.cn/f168792f638e29332d183fc4cfa9ae21_867x148.png) #### 优化办法 1. 从业务上去解决:办法:不允许翻过100页,以百度为例,一般翻页到70页左右,谷歌40页左右. 2. 不用offset,用条件查询 , 用条件替代偏移量 . #### 通过 where+order+limit 取代 order+limit 偏移量,长度 ~~~ +----------+------------+------------------------------------------------------------+ | Query_ID | Duration | Query | +----------+------------+------------------------------------------------------------+ | 1 | 0.00030950 | select * from user where id > 2000000 order by id limit 10 | | 2 | 0.00029175 | select * from user where id > 4000000 order by id limit 10 | +----------+------------+------------------------------------------------------------+ ~~~ 并且使用到了索引: ~~~ id: 1 select_type: SIMPLE table: user partitions: NULL type: range possible_keys: PRIMARY key: PRIMARY key_len: 4 ref: NULL rows: 1232052 filtered: 100.00 Extra: Using where 1 row in set, 1 warning (0.00 sec) ~~~ ![](https://box.kancloud.cn/57f8c2d89a1b8a2748fbb0e5d8391bbb_918x172.png) #### 注意 where+order+limit的算法问题 ![](https://box.kancloud.cn/de1d51e4bb170edf0c84daf580985113_701x252.png) 通过where+order+limit实现数据获取的注意: 1. 排序的字段最好是从1开始,并且是连续自增的,这样方便where计算并获得指定的数据信息. 2. 这种方法使用次数较少 , 一般都是从业务上进行解决,就是限制显示页数 .