Mysql分页设计操作

数据量很大时的分页设计

随着业务的不断发展,可能会导致我们的数据数量会越来越庞大,一般我们会对数据进行分页查询。我们可以通过限制分页查询数量来提升查询效率,但是,当我们的页码横跨很大时,譬如,我当前在第一页,通常一页显示10条数据,假如我们总共有10W条数据,就有1w页。此时我想从第一页跳转到第5k页,如果我们还是用传统的分页模式,就会导致查询性能急速下降,这就违背了我们使用分页的初衷了。

如何解决这种问题呢?

利用主键自增以及主键索引快速定位页码(不推荐)

当我们的主键id设置为自增时,由于整个表数据都是有序的,我们便可根据页码信息计算出数据的起始主键id,按照此方法就可以快速查询数据。不过此方案缺点也十分明显,显然,我们需要整张表数据的有效数据的主键都是连续自增的,这就导致在数据变动时,例如删除数据,我们需要维护整个表的主键id以重新达到连续的效果,反而增加了维护成本。

通过业务层限制显示最大页码选择跨度(推荐)

我们可以通过页面来控制用户可以跨度的最大页码范围,我了解到百度,谷歌等公司都是限制10页。也就是说最大允许用户从第一页跨度到第十页,我们可以分别从前端和后端来限制分页跨度,这就完美解决了问题,并且不需要任何成本。

对大数据进行分页查询提升性能

即使通过上述方案,仅仅解决了“燃眉之急”,因为我们只是限制了用户分页跨度。
一旦在数据量庞大的情况下,其实并没有提升分页的查询,当用户“愣头青”一样一步一步的点到了靠后的页码,性能同样会急速下降。
其实对于大数据分页查询,更推荐专门的中间件来进行,并且可以利用其查询效率实现其他更复杂的查询业务。
如果你确实有这方面的需求:要对大数据进行分页查询,且不想引入其他中间件增加成本,我建议使用子查询优化效率。

SELECT * from orderitems limit 10 OFFSET 2000000;

如上述代码,经优化可以拆成两行查询语句:

 SELECT id from orderitems limit 10 OFFSET 2000000;
 SELECT * from orderitems where id in (x,x,x,x,x,x,x,x,x,x);

经测试,在有2kw+的数据表中可以提升性能5倍以上。

表数据

使用传统分页查询速度:

使用拆分查询速度:

(主要是查询id速度影响较大)

posted @ 2021-07-19 01:16  LovelyLM  阅读(234)  评论(0编辑  收藏  举报