MySQL 如何解决深度翻页

Posted wenniuwuren

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 如何解决深度翻页相关的知识,希望对你有一定的参考价值。

select * from table_a limit m,n;

mysql的 limit m,n 工作原理就是先读取符合where条件的前面m+n条记录,然后抛弃前m条,返回后面n条,所以m越大,偏移量越大,性能就越差。这也是大部分ORM框架生成的分页sql。

那么如何优化呢?

如果 id 是简单的数字,可以这么优化

select * from table_a where id > 1000000 limit 10;

能这么优化是有前提的:

1、没有总页数
2、只能上下翻页
3、id必须有序且唯一

而且现实场景不如像我们例子中那么简单,id 一般可能不是数字,数字的语义过于单薄。

不过类似的,比如我们要查一个有订单号,有业务类型,订单状态的数据行出来,类似上面描述的3个条件,我们要这里的id叫位点(或者游标),要让位点有序且唯一那么设计成:

订单号_时间戳_业务类型

唯一靠订单号、业务类型、时间戳(订单创建时间、订单付款时间、订单确认收货时间)保证,有序靠时间戳保证。

特定的业务有特定的位点设计,上述的位点设计适用于大多数电商场景,其他场景怎么解决深度翻页的位点设计具体业务根据业务特点类似的设计就行。

以上是关于MySQL 如何解决深度翻页的主要内容,如果未能解决你的问题,请参考以下文章

未解决mysql分页性能问题深究

MySQL深度翻页和底层执行原理之间的关联和优化思路

MySQL深度翻页和底层执行原理之间的关联和优化思路

MySQL深度翻页和底层执行原理之间的关联和优化思路

c#如何实现DataGridView翻页显示

翻页测试用例思维逻辑