01
—
活用 max() min()

软件项目实战中,不可避免的都会碰到分页功能。那么实际分页功能实现中,有哪些我们可以讨巧的操作么?灵活使用min(),max()就能比较健壮的实现分页功能。
分页功能中,一般都需要2个参数,一个 pageNo,代表请求的某个页面的页数。一个countNo,代表一个具体某一个页面中,返回的数据条数。

为通用,稳健考虑,countNo会有允许请求最大值,其他可以让调用方灵活处理。为什么要设定一个页面的最大值呢?肯定是本着请求效率高效原则考虑。
现如今,http服务的耗时都主要消耗在2个方面:mysql,网络。如果接口让调用方任意传参调用的话,可以试试,countNo传递一个巨大的数字,比如100000。可以测试看看查询效率,看看mysql请求时长。
$countNo = min($countNo,20);
这一行代码,就很方便的解决掉,调用方传递大值的场景。
同样的,pageNo,默认会需要指定最小页面数据,不能别人不传递pageNo,就不展示出来数据的。
$pageNo = max($pageNo,1); //假设分页从第一页开始。
另外,入参校验逻辑,不在本篇讨论。
02
—
LIMIT 优化
分页功能必然涉及到mysql limit。那么大数据量下的 limit 优化就必然要有所考虑。
id连续场景:
假如,id是连续的。那么可以使用 between 语法来实现。如果,id不连续,那就有问题,取不到所要数目的数据。我们通过explain来观察两个语句的区别:
rows由之前的500020行,缩减到21行。优化效果相当明显。
当然,现实场景中,由于各种原因,id基本上大概率存在不连续情况的。那么这个时候就需要另一种方法。
分页下标:
第二种方法,就是,在分页过程中,记录下上次的分页下标。
我们来看看,采取下标的explain分析结果
对比来看没有采用下标的,从rows来看,效果很明显。
那么这句
select id,num from table order by id asc limit 500000,20
的执行逻辑是什么呢?往下看:
从数据表中读取第N条数据添加到数据集中。重复第一步直到 N = 500000 + 20。根据 offset 抛弃前面 500000 条数。返回剩余的 20 条数据。
这个第二步骤,第三步骤问题比较大,找出500000+20数据,然后又抛弃掉500000条数据,做了很大无用功。
最重要,技术优化永无止境。有时候需要业务增加一小丢丢策略,那么也就不会存在什么其他问题的。
比如,搜索引擎展示数据就最大展示到100页,最大offset也就是 10010。当然,搜索引擎不是简单的mysql,如果在mysql上面,limit 1000,10也不会有其他太多问题的。
不知道这算不算大家所说的降维打击。o( ̄︶ ̄)o