在互联网公司或者一些并发量比较大的项目,虽然有各种项目架构设计、NoSQL、MQ、ES等解决比较高的并发访问,但是对于数据库来说,压力

还是太大,这时候即使数据库架构、表结构、索引等都设计的很好了,但是还是扛不住的,主从复制通过读写分离缓解读负载。但是像淘宝这种项目,

单一数据库肯定是不行的,为了解决这个问题,就可以使用分库分表

PS:这是一篇学习博客,本人没实操过,适合作为入门了解或者面试,如果深入了解,请自行百度大佬的文章

分库分表的方式:

1、把一个实例的多个数据库拆分到不同的实例,这个实例可能是数据库集群

优缺点:

  操作简单

  但是如果写压力存在某个库,这样拆分还是无法解决问题

2、把一个库中的表拆分到不同的数据库

  例如:把一个库中的订单表、商品表、购物车表分别拆分到不同的数据库

3、水平拆分

  在前面两种情况无法解决的情况下,就要使用水平拆分

  对一个库中的相关表进行水平拆分到不同实例的数据库,进行分片处理

分片处理是最后的方案,能在之前解决问题,就不要分片,分片之后会带来很多问题,也会变得复杂

分片前的准备:

分区键决定了分区后的性能,如何选择分区键:

  1、分区键要能尽量避免跨分片查询的发生

  2、分区键要尽可能使各个分片中的数据平均

如何存储不需要分片的表:

  1、每个分片存储一份相同的数据,数据量不大且很少更新的表

  2、使用额外的节点同一存储

如何在节点上部署分片:

  每个分片使用单一数据库,且数据库名相同

  将多个分片表存储在一个数据库中,在表名后加上分片号后缀

  在一个节点中部署多个数据库,每个数据库包含一个分片

如何分配分片中的数据:

  按照分区键的Hash值取模来获取分片数据

  按照分区键的范围来分配分片数据,一般日期类型可以使用这种

  使用分区键和分片的映射表来分配分片数据

如何生成全局ID:

  使用auto_increment_increment(和分片数量一致)和auto_increment_offset参数,只适用于一个节点保存一个分片的场景

  使用全局节点生成ID,先获取全局节点ID,再通过分区函数插入到对应的分片中,但是这个全局节点可能成为性能瓶颈

  在Redis中创建全局ID,最优选择

可以通过工具OneProxy来进行数据库分片,本来想要手动操作的,但是发现oneProxy官网没了。。。

最新文章

  1. Android网络定位服务定制简述
  2. c语言数据结构之 堆排序
  3. scrapy 的 selector 练习
  4. JSP action elements - JavaBean
  5. 2014多校第一场D题 || HDU 4864 Task (贪心)
  6. uvalive 2797 Monster Trap
  7. myeclipse2014新感悟
  8. [2013-07-22]varnish-cache 安装配置及体验笔记
  9. 云计算之路-阿里云上: RDS实例CPU跑满引发的故障
  10. java前台线程和后台线程
  11. Gym - 101490F:Endless Turning (半平面交)
  12. self: 限制并发量asyncio
  13. Python3 urllib抓取指定URL的内容
  14. 批量生成文件夹内所有文件md5
  15. Linux中从oracle官网下载jdk文件不是标准的gzip格式文件问题
  16. ASP.NET Core 中的SEO优化(1):中间件实现服务端静态化缓存
  17. BZOJ1396:识别子串(SAM)
  18. lintcode-18-带重复元素的子集
  19. iphone5s越狱之后必装
  20. PC/APP/H5三端测试的相同与不同

热门文章

  1. 一个很笨的方法,写脚本来实现自动调dmp,找有用的数据
  2. sparkStreaming入门
  3. iOS逆向系列-Cycript
  4. 【数位DP】[LOJ10163]Amount of Degrees
  5. QSerialPort类
  6. leetcode-106-从中序和后序遍历构造二叉树
  7. RabbitMQ 五种工作模式
  8. JWT生成token
  9. csps模拟测试707172部分题解myc
  10. vue 单纯的获取经纬度 百度与高德 H5