数据库水平分表后,分页查询如何实现?

两种解决方案

1.多库分别按条件查询,查询后按照条件重新筛选,筛选后选择对应的数据,同时记录好这次每个库的最大取值,作为下一页的条件

优点:查询简单,

缺点:该方案只能应对不跳页的场景的实现方案

2.计算偏移量方法

第一步:根据当前页和每页条数,计算偏移量

eg:查询第200页,每页5条的数据 SQL语句为select * from T  limit 5 offset 1000;

这里的1000为总偏移量,即200*5;

如果分表为两张,则每张表的偏移量为500,三张表,即为333.

第二步:根据每张表的偏移量查询每张表的分页数据select * from T  limit 200 offset 333;

假设查询结果如下

第三步:根据结果找出上面每个查询结果的最大值和最小值,每个结果的最小值比较,找出最小值min(1487501123),每个结果的最大值max作为查询的自己的查询最大值,作为条件,select from T where time between min and max;对于分库一:即为select from T where time between 1487501123 and 1487501523;

查询结果如下:

可以看到:

由于min来自原来的分库一,所以分库一的返回结果集和第一次查询相同(所以其实这次访问是可以省略的);

分库二的结果集,比第一次多返回了1条数据,头部的1条记录(time最小的记录)是新的(上图中粉色记录);

分库三的结果集,比第一次多返回了2条数据,头部的2条记录(time最小的2条记录)是新的(上图中粉色记录);

在第一个库中,time_min在第一个库的offset是333

在第二个库中,(1487501133, uid_aa)的offset是333(根据第一次查询条件得出的),故虚拟min在第二个库的offset是331

在第三个库中,(1487501143, uid_aaa)的offset是333(根据第一次查询条件得出的),故虚拟min在第三个库的offset是330

综上,min在全局的offset是333+331+330=994

第二次查询在各个分库返回的结果集是有序的,又知道了min在全局的offset是994,一路排下来,容易知道全局offset 1000 limit 5的一页记录(上图中黄色记录)。

是不是非常巧妙?这种方法的优点是:可以精确的返回业务所需数据,每次返回的数据量都非常小,不会随着翻页增加数据的返回量。

总结来说,就是根据偏移量找出其中最小值,在取出当前库最小值和最大值的数据,拿出来排序,去掉差值,再取分页条数。

数据库分表分页实现方案相关推荐

  1. MySQL 跨库分页/ 分表分页,为什么这么难?

    以下内容来自公众号逆锋起笔,关注每日干货及时送达 来源:https://www.cnblogs.com/yjmyzz/p/12149737.html 当业务数据达到一定量级(比如:mysql单表记录量 ...

  2. MySQL 跨库分页/ 分表分页/ 跨库分页,为什么这么难?

    来源:https://www.cnblogs.com/yjmyzz/p/12149737.html 当业务数据达到一定量级(比如:mysql单表记录量>1千万)后,通常会考虑"分库分表 ...

  3. 超大数据量存储常用数据库分表分库算法总结

    这篇文章主要介绍了超大数据量存储常用数据库分表分库算法总结,本文讲解了按自然时间来分表/分库.按数字类型hash分表/分库.按md5值来分表/分库三种方法,以及分表所带来的问题探讨,需要的朋友可以参考 ...

  4. 数据库分表之雪花算法

    文章目录 一.背景 二.数据库分表 1. 垂直分表 2. 水平分表 一.背景 需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量. 数据库的扩展方式主要包括:业务分库.主从复制, ...

  5. php mysql新闻表模板_新闻数据库分表案例

    新闻数据库分表案例目录:[-]NetkillerMySQL手札MySQLMariaDB...Mr.NeoChan,陈景峰(BG7NYT)4.16.3.新闻数据库分表案例NetkillerMySQL手札 ...

  6. mysql新闻分表,新闻数据库分表案例 - http://www.netkiller.cn - OSCHINA - 中文开源技术交流社区...

    本文节选自<Netkiller Architect 手札> 6.3. 新闻数据库分表案例 这里我通过一个新闻网站为例,解决分表的问题 避免开发中经常拼接表,我采用一个一劳永逸的方法,建立一 ...

  7. 数据库分表分库相关知识

    分表的方式 垂直分表 垂直分表在日常开发和设计中比较常见,通俗的说法叫做"大表拆小表",拆分是基于关系型数据库中的"列"(字段)进行的.通常情况,某个表中的字段 ...

  8. 数据库分表时OR Mapping方法

    最近使用ADO.net Entity应用中遇到一个分表的应用,IDE中是不可视化支持这个的,为此使用了基于LINQ的方法解决了该问题. 数据库分表的意义和目的 分表技术顾名思义,就是把若干个存储相同类 ...

  9. mysql一张表1亿天数据_1亿条数据在PHP中实现Mysql数据库分表100张

    转: 1亿条数据在PHP中实现Mysql数据库分表100张 http://php-z.com/thread-2115-1-1.html (出处: PHP-Z) 当数据量猛增的时候,大家都会选择库表散列 ...

最新文章

  1. Fedora Core 4配置本地yum源
  2. A Tutorial on Clustering Algorithms-聚类小知识
  3. 麦格纳软件公司绩效考核信息化管理解决方案
  4. android 升级带服务端,安卓应用升级服务端设计思路
  5. C程序中如何获取shell命令执行结果和返回值
  6. docker gpu报错Error response from daemon: could not select device driver ““ with capabilities: [[gpu]]
  7. iOS 给测试人员测试手机APP的四种方法:真机运行(略),打ipa包,(testFlighe)邮件,蒲公英(二)testflight
  8. C++primer 13.1.2节练习
  9. Adobe Reader PDF阅读器背景设置为护眼豆沙色
  10. 使用Stream生成菜单、地区树
  11. 【STM32+STM32CubeMX】控制ws2812b灯珠
  12. 机智云开源框架二次开发之换皮肤,几乎不用改代码
  13. 软件测试——开发模型、测试模型介绍
  14. 纯CSS实现气泡框和内凹的圆角
  15. matlab函数power,Matlab中Powergui介绍.pdf
  16. 翻译 RFC 7322: RFC 样式指南
  17. NLP工具——Stanza依存关系含义详解
  18. [踩坑解决]npm ERR! gyp info it worked if it ends with oknpm ERR! gyp verb cli [
  19. 程序员怒批996背后的支持者,刘强东和马云哑口无言!
  20. 盘点激光雷达技术在智能交通上的应用

热门文章

  1. 一套全开源的智慧园区管理系统源码
  2. 1.生命游戏(netlogo)
  3. PowerBuilder(pb)真的弱吗?还是你不会?PB项目二次开发、系统的维护、兼职业务
  4. 深度解决企业传统办公痛点,华为云桌面使能云上办公!
  5. 哪些大学计算机学术实力更强?计算机科学ESI前1‰学科出炉
  6. 零基础,自学JAVA编程需要多长时间才能学完?
  7. 追踪放“马”贼——从木马中分析放马者手记
  8. WeChall CTF Writeup(七)
  9. matlab 行列的扩展缩小操作
  10. java source 1.5_解决:Java source1.5不支持diamond运算符,请使用source 7或更高版本以启用diamond运算符...