数据库分库分表一般是存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕。分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。

什么是分表?

分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。app读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它。

什么是分区?

分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候操作的还是大表名字,db自动去组织分区的数据。

MYISAM 分表方法,就是根据自增id的尾数来分,也就是说分0-9一共10个表,其取值也很好做,就是对10进行取模。另外,还可以根据某一字段的md5值取其中几位进行分表,这样的话,可以分的表就很多了。

如果把1.5千万作为一个最大上限值, 也就是0.5倍的上浮空间, 这时我们把1.5倍的x=每张表的1千万(1.5x=1千万),那么x=0.67千万, y(y是分表数)张0.67千万=一亿, y=15,   这时在按2的倍数创建表的话,就是16了。
复杂的可能会涉及到自定义函数或哈希算法, 我现在拿分成十张表距离, 你可以按用户id结尾0,1,2,3...9的不同存到10张表里边去。
如果把1.5千万作为一个最大上限值, 也就是0.5倍的上浮空间, 这时我们把1.5倍的x=每张表的1千万(1.5x=1千万),那么x=0.67千万, y(y是分表数)张0.67千万=一亿, y=15,   这时在按2的倍数创建表的话,就是16了。

MySQL的单表承载的数据量有限,一般在1000万以内,字段多一些还会更少,我们解决这种业务就需要对数据进行拆分,也叫sharding ,将一个表拆分多个表,或者多个数据库,分表逻辑分库差不多。

拆分需要考虑的数据和业务逻辑。按照用户维度、商品维度或订单维度等拆分。

拆分因子选择

因子选择,要看这个表所支撑的业务。

举例1、京东的京豆

京豆是属于用户维度的,我们的操作都是查询某个人的京豆,所以这个京豆库存流水信息就可以按照用户维度进行拆分,保证同一个人的京豆都存储在同一张表里面。

举例2、电商的商品信息

商品信息属于商家维度,我们一般都是进到一个店铺,查看这个店铺有哪些商品,商家查看自己的商品,所以这个商品信息就可以按照商家维度拆分,保证同一个商家的信息在同一表里面。

极端例子:订单表

订单表即属于商家,又属于用户,此时我们的选择是优先用户,可以按照用户维度进行拆分,其次通过冗余索引或冗余数据来为商户提供服务,比如创建一套商户维度的数据,然后商户维度数据采用异步非实时的机制进行同步数据。

拆分方法

如果你的业务是按照时间进行分表,每隔一段时间创建一个新表的话,就没有具体的拆分方式了,一定时间创建一个新表就可以了,但如果是有拆分因子,可以按照如下步骤考虑:

1、预估容量

预估该系统要支撑几年,大概的一个数据量,按照每个表1000w左右进行评估,如果未来5年可以达到1亿数据,那么拆分10张表即可,加上一定的上浮空间,一般用2的倍数,拆分成16张就够了。

2、考虑扩展性

如果我们16张表不够用的时候,该怎么办,那32张是否足够,如果提前做好扩展性。

实践

比如每个订单,都给用户发放一定的奖励金,我们要记录每次发放的奖励金信息,我们按照用户维度进行分表;

1、每天100w订单,也就100w条记录

2、系统支撑5年,5*365*100w 约等于 18.25亿

3、每张表最多存1000w数据,大约182张表

考虑到扩展性 我们准备最多分256张表(2的倍数)可以先拆分出16张表,随着业务扩展最多分256张。

考虑到扩展性 我们准备最多分256张表(2的倍数)可以先拆分出16张表,随着业务扩展最多分256张.

表的命名,user_001,user_016,user_032 ... user_240 累计16张表,选择等步长为了每个表之间可以做扩展

一致性Hash算法

转载于:https://www.cnblogs.com/hanling/p/8474518.html

数据库分表和分库 一点积累相关推荐

  1. thinkphp mysql分表_数据库分表和分库的原理及基于thinkPHP的实现方法

    为什么要分表,分库: 当我们的数据表数据量,访问量很大,或者是使用频繁的时候,一个数据表已经不能承受如此大的数据访问和存储,所以,为了减轻数据库的负担,加快数据的存储,就需要将一张表分成多张,及将一类 ...

  2. [转载]学习数据库分表和分库思想

    目录: 基本思想之什么是分库分表 基本思想之为什么要分库分表 分库分表的实施策略 何谓垂直切分 何谓水平切分 应该使用哪一种方式来实施数据库分库分表这要看数据库中数据量的瓶颈所在并综合项目的业务类型进 ...

  3. 秋色园QBlog技术原理解析:性能优化篇:数据库文章表分表及分库减压方案(十五)...

    文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色 ...

  4. 分区和分片的区别_数据库的分表、分库、分片和分区等区别

    一.Sharding(分片) Sharding 是把数据库横向扩展(Scale Out)到多个物理节点上的一种有效的方式,其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题 ...

  5. 数据库分区、分表、分库、分片

    一.分区的概念 数据分区是一种物理数据库的设计技术,它的目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间. 分区并不是生成新的数据表,而是将表的数据均衡分摊到不同的硬盘,系统或是不同服务 ...

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

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

  7. 数据库分表分库策略和原则

    概念 数据库分库分表原则遵循:垂直拆分和水平拆分 ①垂直拆分 垂直拆分就是根据不同的业务,分为不同的数据库,比如会员数据库.订单数据库.支付数据库等,垂直拆分在大型电商系统中用的非常常见. 优点:  ...

  8. 数据库分区、分表与分库管理

    目录 一.数据库分区 1. 定义 2. 优点 3. 分类 4. 使用场景 二.数据库分表 1. 定义 2. 作用 3. 使用场景 4. 分区和分表的区别 三.数据库分库​ ​​​​​​​1. 目的 2 ...

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

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

最新文章

  1. 记录一下Python-Qt中按钮点击事件无响应解决方案
  2. Ubuntu下vi编辑器方向键变成字母的解决方法
  3. linux几种常见的Shell:sh、bash、csh、tcsh、ash
  4. Windows 7 SP1确实将有性能改进
  5. Kubernetes 稳定性保障手册 -- 极简版
  6. Oracle查找包共用,oracle – 用于查找包的多级依赖关系的脚本
  7. [转帖]Docker 清理占用的磁盘空间
  8. 系统动力学模型_蓝谷学术动态|典型海洋生态系统动力学模型构建、应用及发展入选2020年经典中国国际出版工程...
  9. vue可以直接进行运算么_Vue实现手机计算器
  10. 《马志军20岁书法作品集》序
  11. 算法设计——五大算法总结
  12. TKMybatis的使用大全和例子(example、Criteria、and、or)
  13. vnc远程控制软件,超好用的5款vnc远程控制软件
  14. 数据库系统的组成及模式结构
  15. 原生js高仿浏览器ctrf+f
  16. 别忘了看,今年中秋月亮“瘦”了!网友扎心了:我还没瘦…
  17. 阿里云混合云重磅发布 全栈建云智能管云极致用云
  18. 计算机一级电子表格TF函数,TFG1000系列DDS函数信号发生器基本操作
  19. Gartner 2022 应用安全测试魔力象限
  20. android 儿童 汉字 学习 游戏,儿童学汉字游戏app

热门文章

  1. python中的pylab_python-什么是%pylab?
  2. 简述er图的作用_【ER图的含义】作业帮
  3. java.sql.date 与 java.util.date及使用方法
  4. matlab上升时间,上升时间(上升时间反映了系统的)
  5. 西安理工大学计算机科学博士名单,孙钦东(博导)
  6. html网页渲染过程
  7. Inkscape扩展:图案沿着路径和散布
  8. 同时多个视频剪辑,视频配音频,添加滚动字幕
  9. 【C语言】经典题目(二)
  10. 音符起始点检测(音频节奏检测)(7)