千万条据下的分页

1.1. 背景

对于开发来说,分页功能碰到的频率还是算蛮高的,基本上在每个模块中都需要都会遇到列表分页的功能。他们实现的都很快,因为基本上只要把之前的代码改改就OK了。他们的实现基本是是如下语句:

像这样的语句对数据量小或偏移量小的时候是十分快的。但是当数据量大并且偏移量大的时候就会有问题了。如下:

为什么会这样就不说了。下面给出优化的过程。

1.2. 构建数据

这边我们以数据最多的user_id=4的记录来模拟

1.3. 优化规则

让所有结果集数据最小化。如果是临时表,还是行数据还是列数据都让结果最小化,还有就是临时结果集尽量不走主键索引,走二级索引。

1.4. 模拟

现在我们需要查询用户4在10000000后20条数据

1、通过user_id找到主键ID(让列结果最小化)

2、通过获得的主键ID寻找需要的数据,这边我就不使用python来演示了。在程序里面就需要拼出IN里面的条件。

1.5. 进一步优化

其实上面我们还能让结构级变少。来看下面列表简图:

mysql

在网页的分页按钮基本省都是一个连接,或者通过jquery时间分页。我们可以在按钮上添加两个属性参数为max_id和min_id。分别记录的是当前页数据的最小ID和最大ID(如:min_max=10343427、max_id=10343446)。

查找数据如下:

1、通过user_id找到主键ID(让列结果最小化)

如果是点击下一页

如果是点击上一页(上一页会比下一页性能来的差一点,因为有用到排序)

2、通过获得的主键ID寻找需要的数据

1.6. 总结

这种优化可能在一些使用到聚合函数的排序的情况下没法使用。

在这边鼓励使用MySQL的尽量使用比较简单的语句,不使用JOIN。因为优化器对简单的语句解析的很快,而且在维护的角度来说越白痴的语句越让人容易明白。

当然,强烈反对在程序中 for 循环取数据库。

 

昵称:HH
QQ:275258836
ttlsa群交流沟通(QQ群②:6690706 QQ群③:168085569 QQ群④:415230207(新) 微信公众号:ttlsacom)

感觉本文内容不错,读后有收获?

逛逛衣服店,鼓励作者写出更好文章。

HH

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: