分库分表优化 禁用跨页查询

简介: 【7月更文挑战第6天】

一张表上面有 70% 的数据,但是另一张表上只有 30% 的数据,那么在 LIMIT 10 OFFSET 100 的场景下,可以在 70% 的表里取 LIMIT 7 OFFSET 70,在 30% 的表里取 LIMIT 3 OFFSET 30。所以,也可以把前面平均分配的方案看作是各取 50% 的特例

那如何知道一张表上有70%的数据,另外一张表上有30%。
在开发的时候先用SQL在不同的表上执行一下,看看同样的WHERE条件下各自返回了多少数据,就可以推断出来了。
不过实际上,能够接受不精确的业务场景还是比较少的。所以我们还有一种业务折中的解决方案,它精确并且高效,也就是禁用跨页查询方案。

只允许用户从第0页开始,逐页往后翻,不允许跨页。
假如业务上分页查询是50条数据一页,那么发起的查询依次是:

SELECT * FROM order_tab ORDER BY id LIMIT 50 OFFSET 0
SELECT * FROM order_tab ORDER BY id LIMIT 50 OFFSET 50
SELECT * FROM order_tab ORDER BY id LIMIT 50 OFFSET 100
...

不断增长的只有偏移量,如何控制住这个偏移量呢?
答案是根据ORDER BY的部分来增加一个查询条件。上述例子里的order by是根据id升序排序的,只需要在where部分增加一个大于上次查询的最大id的条件就可以了。max_id是上一批次的最大id

SELECT * FROM order_tab WHERE `id` > max_id ORDER BY id LIMIT 50 OFFSET 0

即使order by里使用了多个列,规则也是一样的

总体来看,回答要分成两部分,第一部分介绍基本做法,关键词是拿到上一批次的极值

目前比较好的分页做法是禁用跨页查询,然后在每一次查询条件里加上上依次查询的极值,也就是最大值或者最小值。

目录
相关文章
|
缓存 安全 API
RPC vs. HTTP:谁主沉浮在网络通信的江湖?
RPC vs. HTTP:谁主沉浮在网络通信的江湖?
1537 0
|
存储 安全 算法
3.【Elasticsearch】Elasticsearch从入门到放弃-权重及打分
【Elasticsearch】Elasticsearch从入门到放弃-权重及打分
3.【Elasticsearch】Elasticsearch从入门到放弃-权重及打分
|
Java 数据库 网络架构
Hystrix使用及其配置详解
Hystrix使用及其配置详解
1852 0
Hystrix使用及其配置详解
|
6月前
|
SQL Java 数据库
解决Java Spring Boot应用中MyBatis-Plus查询问题的策略。
保持技能更新是侦探的重要素质。定期回顾最佳实践和新技术。比如,定期查看MyBatis-Plus的更新和社区的最佳做法,这样才能不断提升查询效率和性能。
274 1
|
10月前
|
设计模式 架构师 Java
设计模式觉醒系列(01)设计模式的基石 | 六大原则的核心是什么?
本文介绍了设计模式的六大原则,包括单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)、依赖倒置原则(DIP)和迪米特法则。通过具体案例分析了每个原则的应用场景及优势,强调了这些原则在提升代码可维护性、可复用性、可扩展性和降低耦合度方面的重要作用。文章指出,设计模式的核心在于确保系统模块间的低耦合高内聚,并为后续深入探讨23个经典设计模式打下基础。
|
存储 移动开发 JavaScript
React18组件一键转换Vue3组件(持续更新中)
其实现在Vue也是很火的框架随着Vue3的诞生,博主其实最终目标是想整合一套React+一套Vue组件库在一起的,但是重写一遍React的组件很费工作量也不现实,因为我是单人开发,于是就萌生了写一个React组件转换Vue组件的工具,功能性将逐步开发更新到博客,喜欢的可以关注一下
1172 1
React18组件一键转换Vue3组件(持续更新中)
|
存储 SQL 关系型数据库
深入MySQL锁机制:原理、死锁解决及Java防范技巧
深入MySQL锁机制:原理、死锁解决及Java防范技巧
|
JavaScript 应用服务中间件 nginx
nginx配置解决vue刷新404、swagger 页面访问(springboot+vue项目)
nginx配置解决vue刷新404、swagger 页面访问(springboot+vue项目)
658 0
|
存储 Oracle 关系型数据库
使用Docker安装ClickHouse
ClickHouse是一个由俄罗斯最大的搜索公司Yandex开源的列式数据库(DBMS),主要用于在线分析处理查询(OLAP),于2016年开源,采用C++开发。凭借优秀的性能,市场反应非常热烈。
2924 0
使用Docker安装ClickHouse
|
存储 SQL 关系型数据库
面试官:MySQL 啥时候用记录锁,啥时候用间隙锁?
MySQL 啥时候会用记录锁,啥时候会用间隙锁,啥时候又会用 Next-Key 锁呢?今天我们就来做一些测试,弄清楚这个问题。
面试官:MySQL 啥时候用记录锁,啥时候用间隙锁?