面试官:"谈谈分库分表吧?"
转自:学习Java的小姐姐
www.cnblogs.com/chenchen0618/p/11624480.html
1.什么是分库分表
从字面上简单理解,就是将原本存储在一个库的数据分块存储在多个库上,将原本存储在一个表的数据分块存储在多个表里面。
数据的切分根据其切分规则的类型,可以分为如下两种切分模式。
垂直(纵向)切分:把单一的表拆分成多个表,并分散到不同的数据库(主机)上。
比如一个订单表里面有用户信息,商品信息,收货地址信息,促销信息,这样表的字段太多,显得特别臃肿,所以我们将他们各自分隔出来,形成多张表存储数据。
优点:
- 拆分后业务清晰,拆分规则明确。
- 系统之间进行整合或扩展很容易。
- 按照成本、应用的等级、应用的类型等将表放到不同的机器上,便于管理。
- 数据维护简单。
缺点:
- 业务表多样,SQL语句复杂。
水平(横向)切分:根据表中数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上。与垂直切分对比,水平切分不是将表进行分类,而是将其按照某个字段的某种规则分散到多个库中,在每个表中包含一部分数据,所有表加起来就是全量的数据。
比如有一个用户表,单张表的记录条数达到1亿条,这样在进行查询,插入,更新操作的时候,速度将非常慢,那我们可以将这些数据分配到100个表里面,每个表的数据量就下来了,导致单表的容量不会太大,从而保证了单表的查询等处理能力。
我们通常将数据分配的原则称为分片规则,常见的分片规则有对用户的id取模。
注意:一定要好好决定分片规则,尽量选择不会变动的字段,如果选择区域,性别,年龄等字段,当用户修改这些信息的时候又要讲数据移动到其他数据库,这里面的逻辑也很头疼。
优点:
- 单库单表的数据保持在一定的量级,有助于性能的提高。
- 切分的表的结构相同,应用层改造较少,只需要增加路由规则即可。
- 提高了系统的稳定性和负载能力。
缺点:
- 切分后,数据是分散的,很难利用数据库的Join操作,跨库Join性能较差。
- 拆分规则难以抽象。
- 分片事务的一致性难以解决。
- 数据扩容的难度和维护量极大。
2.为什么要用分库分表
数据库负载增大时的处理:随着我们的应用的用户量越来越大,访问量也随之提升,当他们提升到一定的量级之后,应用也就越来越慢。当然我们可以通过增大前端应用负载的方式来提升速度,但是直到有一天我们发现无论如何增大前端应用负载都不能提升速度,我们就逐步找到原因,是数据库的问题。因为数据库是存在性能瓶颈的,这是无法避免的。
3.市面上常用中间件
MyCat
MyCat:是一个中间件的第三方应用,使用MyCat时不需要改代码。
我们在使用的时候,如果有多个库,我们在代码里面就只要写MyCat对外的一个逻辑库信息就行,而数据库层面的配置,比如总共有多少个库,每个库里面的表,每个表的分片规则,这些都是在MyCat里面配置,不需要修改代码信息。
具体的逻辑图如下:

Sharding-JDBC
Sharding-JDBC:是一个jar包,使用Sharding-JDBC时需要修改代码。
我们在使用的时候,需要引入Sharding-JDBC的jar包,在配置文件里面写明总共有多少个库,每个库里面的表,每个表的分片规则等信息。
具体的逻辑图如下:

如何选择中间件?
Sharding-JDBC和Mycat使用不同的理念,Sharding-JDBC目前是基于JDBC驱动,无需额外的proxy,因此也无需关注proxy本身的高可用。MyCat 是基于 Proxy,它复写了 MySQL 协议,将 Mycat Server 伪装成一个 MySQL 数据库,而 Sharding-JDBC 是基于 JDBC 接口的扩展,是以 jar 包的形式提供轻量级服务的。
其实MyCat很适合中小企业使用的。可以非常容易的实现数据库的读写分离和分库分表,反而对于大企业来说,都会自己开发适合自己的数据库中间层应用,比如Sharding-JDBC原来就是当当网内部的数据库中间件,后来开源出来的。
欢迎关注我的公众号::一点教程。获得独家整理的学习资源和日常干货推送。
如果您对我的系列教程感兴趣,也可以关注我的网站:yiidian.com
面试官:"谈谈分库分表吧?"的更多相关文章
- 面试官:"谈谈分库分表吧?"
原文链接:面试官:"谈谈分库分表吧?" 面试官:“有并发的经验没?” 应聘者:“有一点.” 面试官:“那你们为了处理并发,做了哪些优化?” 应聘者:“前后端分离啊,限流啊 ...
- 面试官:分库分表之后,id 主键如何处理?
面试题 分库分表之后,id 主键如何处理? 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后,每个表都是从 1 开始累加,那肯定不对啊,需要一个全 ...
- 面试系列38 分库分表之后,id主键如何处理?
(1)数据库自增id 这个就是说你的系统里每次得到一个id,都是往一个库的一个表里插入一条没什么业务含义的数据,然后获取一个数据库自增的一个id.拿到这个id之后再往对应的分库分表里去写入. 这个方案 ...
- 面试官:说说Mysql数据库分库分表,并且会有哪些问题?
之前一篇文章已经谈到了数据库集群之主从集群也就是读写分离,也提到了读写分离其实只是分担了访问的压力,但是存储的压力没有解决. 存储的压力说白了就是随着系统的演化,需求的增加,可能表的数量会逐渐增多,比 ...
- php面试专题---mysql数据库分库分表
php面试专题---mysql数据库分库分表 一.总结 一句话总结: 通过数据切分技术将一个大的MySQLServer切分成多个小的MySQLServer,既攻克了写入性能瓶颈问题,同一时候也再一次提 ...
- mysql分库分表那些事
为什么使用分库分表? 如下内容,引用自 Sharding Sphere 的文档,写的很大气. <ShardingSphere > 概念 & 功能 > 数据分片> 传统的 ...
- DBA 小记 — 分库分表、主从、读写分离
前言 我在上篇博客 "Spring Boot 的实践与思考" 中比对不同规范的 ORM 框架应用场景的时候提到过主从与读写分离,本篇随笔将针对此和分库分表进行更深入地探讨. 1. ...
- 分库分表数据库自增 id
分库分表之后,ID 主键如何处理? 面试题 分库分表之后,id 主键如何处理? 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后,每个表都是从 1 ...
- 分布式中的分库分表之后,ID 主键如何处理?
面试题 分库分表之后,id 主键如何处理?(唯一性,排序等) 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后,每个表都是从 1 开始累加,那肯定 ...
随机推荐
- Python3 虚拟开发环境搭建
虚拟环境的搭建 优点 1.使不同应用开发环境相互独立 2.环境升级不影响其他应用,也不会影响全局的python环境 3.防止出现包管理混乱及包版本冲突 windows 安装 # 建议使用pip3安装到 ...
- InterpreterPattern(解释器模式)-----Java/.Net
解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式.这种模式实现了一个表达式接口,该接口解释一个特定的上下文.这种模式被用在 SQL 解析.符号处 ...
- 「USACO11NOV」牛的障碍Cow Steeplechase 解题报告
题面 横的,竖的线短段,求最多能取几条没有相交的线段? 思路 学过网络流的童鞋在哪里? 是时候重整网络流雄风了! 好吧,废话不多说 这是一道最小割的题目 怎么想呢? 要取最多,那反过来不就是不能取的要 ...
- 阿里云函数计算 .NET Core 初体验
体验了一波阿里云函数计算, 已支持 .NET Core 2.1, 那么按照惯例, 来写个 "Hello World" 吧. 作者注: 开发环境 Windows 10 & V ...
- Python 愤怒的小鸟代码实现:物理引擎pymunk使用
游戏介绍 最近比较忙,周末正好有时间写了python版本的愤怒的小鸟,使用了物理引擎pymunk,图片资源是从github上下载的,实现了一个可玩的简单版本. 功能实现如下: 支持小鸟类型:红色小鸟, ...
- [技术翻译]Web网页内容是如何影响电池使用寿命的?
本周再来翻译一些技术文章,本次预计翻译三篇文章如下: 04.[译]使用Nuxt生成静态网站(Generate Static Websites with Nuxt) 05.[译]Web网页内容是如何影响 ...
- 《图解机器学习-杉山将著》读书笔记---CH2
CH2 学习模型 重点提炼 学习模型作用: 使特定函数与数据集相近似 学习模型类型: 1.线性模型 (1)最简单的线性模型,缺点:只能表现线性的输入输出函数,不能很好地解决实际问题 (2)基于参数的线 ...
- Netty快速入门(02)Java I/O(BIO)介绍
BIO简介 Java I/O,也叫Blocking I/O,也就是阻塞式I/O. BIO的流程比较简单,在服务端创立一个ServerSocket去监听,等待连接.客户端创建一个Socket连接过来,服 ...
- ArcEngine版本管理(Version)项目总结
需求: 在ArcGIS项目中,大型的数据库都是使用ArcSDE进行连接管理.使用的数据版本(Version)都是默认版本(sde.default).这样多个人员在编辑的过程中就直接编辑的是默认版本数据 ...
- 自定义博客cnblogs样式的必备前端小知识——css
css样式相关小知识 文字超出一行显示省略号 overflow: hidden; /*自动隐藏文字*/ text-overflow: ellipsis; /*文字隐藏后添加省略号*/ white-sp ...