记一次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速度影响较大)

原文地址:https://www.cnblogs.com/lovelylm/p/15028529.html