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叫位点,要让位点有序且唯一那么设计成:

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

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

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章