分库分表越来越影响系统应用的高可用、高并发问题,下面和分库分表再相约,聊聊mysql环境的分库分表。

  • what:什么是分库分表
  • why:为什么需要分库分表
  • how:如何进行分库分表
  • when/where:什么时候/环境考虑分库分表
  • problem:分库分表带来的问题

what
分库,就是将一个数据库分成多个数据库,部署到不同的机器。

分表,就是将一个数据表分成多个数据表。

why
数据量越来越大,数据库会出现性能瓶颈。
分库,随着业务量剧增,单个数据库所在机器的磁盘容量可能会撑爆,分成多个数据库,部署到不同机器,解决单个机器的磁盘被撑爆的问题。在高并发的场景下,单个数据库是扛不住大量请求的并发连接的,分成多个数据库,部署到不同机器,分担单个数据库的并发请求压力。
分表,随着数据量增大,sql的查询会越来越慢。如果单表的数据量超过一千万条的话,查询是明显变慢的。mysql的索引一般是B+树结构,数据千万级别的话,B+树的高度会增高,B+树高度一般为1-3层,若超过3层,查询会变慢。

how
分库,可以分为垂直分库和水平分库。

垂直分库,就是根据不同的业务进行拆分,比如将包含用户表、订单表的数据库拆分成用户库、订单库,部署在不同的机器。垂直分库将原来一个单数据库的压力分担到不同的数据库,可以很好应对高并发场景。
水平分库,就是根据不同的策略(如地址、奇偶)分到不同的数据库,每个数据库具有相同的表,水平分库可以有效的缓解单机单库的性能瓶颈和压力。

垂直分表,就是将表中的一些字段拆分到另一张表中。如果单表包含了几十列甚至上百列,每次都select *占用IO资源。垂直分表可以有效降低单机单表的IO资源。
水平分表,就是将表按照某种策略分到不同的表,每个表具有相同的字段,水平分表可以有效的降低单表的数据量。

具体的如何分库分表可以查看之前博客《Java中分库分表粗谈》。

分库分表的策略常用的有range范围、hash去模、range+hash混合。
range范围就是按照从0-1000万划分为一个表,1000-2000万划分为另一个表。也可以按照时间划分。

hash取模就是根据key进行去模拆分到不同的表。

when/where
如果系统处于快速发展期,单机单库成为了性能瓶颈就需要考虑分库了。每天单表新增几十万,查询效率明显变慢时,就需要考虑分库分表了。一般B+树索引高度是2~3层最佳,如果数据量千万级别,可能高度就变4层了,数据量就会明显变慢了。mysql本身并没有对单表的最大记录数进行限制,这个数值取决于操作系统对单个文件的限制,单表的行数上限都是内存的限制。不过业界流传,一般500万数据或单表容量超过2GB就要考虑分表了。

problem
分库分表也会随之带来一些问题。
事务,分库分表后若是两个表在不同的数据库,那么事务失效,需要使用分布式事务。
关联查询,需要分开查询。
排序,需要在各自结果上在程序端进行合并。
分页,需要在各自结果上在程序端进行汇聚再分页。
分布式Id,数据库的主键需要使用分布式Id,如雪花算法生成的Id。

实现分库分表的中间件有很多,可自行选择,也可参考之前博客介绍的sharding-sphere。

Java中分库分表再相约相关推荐

  1. 收好这份武林秘籍,让你分库分表再无烦恼

    互联网发展至今,各个公司企业的数据量都大幅增长,分库分表越来越多的被我们用到,那么我们应该如何针对我们自己的业务场景,对数据进行合理的划分,用最小的代价解决掉性能瓶颈. 1 分库分表的介绍 1.1 什 ...

  2. java hash 分库分表_分库分表方案

    摘自:Java技术栈 一.数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值. 在业务Service来看就是,可用数据库连接少 ...

  3. 太强了!这款轻量级的数据库中间件完美解决了SpringBoot中分库分表问题

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:Macky_He blog.csdn.net/Macky_H ...

  4. Java Spring 分库分表方案概述

    目前分库分表的实现上无非就那么几大类实现 分库方案: 方案1.采用类似于oceanbase这样的数据存储,最方法,后期维护也比较方便的方案,但是灵活性上,性能上很难说 方案2.采用开源组件,如apac ...

  5. 分库分表中间件 Sharding-Sphere

    文章目录 一.什么是Sharding-JDBC 发展历程 sharding-jdbc 和 mycat 分布式事务 Apache ServiceComb的分布式事务解决方案 XA分布式事务 基于分布式S ...

  6. mysql中的分库分表

    大表怎么优化?某个表有近千万数据,CRUD比较慢,如何优化?分库分表了是怎么做的?分表分库了有什么问题?有用到中间件么?他们的原理知道么? 文章目录 大表怎么优化 分库分表 垂直分区 垂直分表 水平分 ...

  7. java面试-MySQL篇分库分表策略

    1.数据库的三范式是什么 第一范式:列不可再分 第二范式:行可以唯一区分,主键约束 第三范式:表的非主属性不能依赖与其他表的非主属性 外键约束 且三大范式是一级一级依赖的,第二范式建立在第一范式上,第 ...

  8. java面试 mysql分库分表_MySQL性能管理及架构设计(三):SQL查询优化、分库分表 - 完结篇...

    一.SQL查询优化(重要) 1.1 获取有性能问题SQL的三种方式 通过用户反馈获取存在性能问题的SQL: 通过慢查日志获取存在性能问题的SQL: 实时获取存在性能问题的SQL: 1.1.2 慢查日志 ...

  9. 盘点分库分表中,你一定要避开的那些坑!

    例如:单表中出现了,动辄百万甚至千万级别的数据."分表分库"就成为解决上述问题的有效工具. 今天和大家一起探讨:如何进行分表分库以及期间遇到的问题. 为什么会分表分库 数据库数据会 ...

最新文章

  1. 创新工场有哪些失败项目?不要只看着成功
  2. 分布式大数据sql查询引擎Presto初识
  3. 基于FPGA的LED点阵系统开发
  4. C++运算符重载(友元函数方式)
  5. Function、Object、Prototype 之间的关系解析
  6. WP评论系统更换小结(转)
  7. 《软件建模技术》课程教学大纲
  8. 网格布局每个网格都能放置一个组件_Android综合试题
  9. [转载] python 字符串转换long_python整数、字符串、字节串相互转换
  10. .Net Core之初识及WebApi的简单使用和发布
  11. linux 内核 addr2line,内核调试 arm-none-linux-gnueabi-addr2line 工具使用
  12. 英语论文应该怎么查重?
  13. Pop猫 回收站图标
  14. 葡萄汽水(Grape soda)
  15. 零点漂移、零点补偿问题
  16. android搜索功能以及显示历史纪录带清除按钮
  17. 数电常见74系列器件及其功能总结(不要再混乱啦,值得收藏)
  18. NOI 2005 题解
  19. Makerdown小白使用指南
  20. 计算机硬件知识试题,计算机硬件基础知识试题.doc

热门文章

  1. 【cpu概念】物理cpu个数、核数、逻辑cpu数的概念
  2. java查看cpu核数以及jvm内存
  3. 神经系统简笔画 结构图,神经系统的组成简笔画
  4. 设置页布局神器!有了它,开发设置页简直是享受
  5. 苹果5概念机_vivo 概念手机发布了,未来的手机就长这样
  6. 2.7 JavaScript 三元表达式
  7. JS三元表达式多条件写法
  8. js对象长度与js数组长度
  9. java实现微信支付宝等多个支付平台合一的二维码支付(maven+spring springmvc mybatis框架)
  10. 爱玛“2022追星计划”打造摩登复古风,再掀电动车潮流革命