“ 心中醒,口中说,纸上作,不从头上习过,皆无用也。”
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是连续的。那么可以使用 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也就是 100*10。当然,搜索引擎不是简单的mysql,如果在mysql里面,limit 1000,10也不会有其他太多问题的。
不知道这算不算你们所说的聚类严打。o(* ̄︶ ̄*)o