文档章节

Mysql分库分表方案

凯文加内特
 凯文加内特
发布于 2014/02/13 10:41
字数 1031
阅读 54807
收藏 59

Mysql分库分表方案

1.为什么要分表:

当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。

mysql中有一种机制是表锁定和行锁定,是为了保证数据的完整性。表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作。

2. mysql proxy:amoeba

做mysql集群,利用amoeba

从上层的java程序来讲,不需要知道主服务器和从服务器的来源,即主从数据库服务器对于上层来讲是透明的。可以通过amoeba来配置。

 3.大数据量并且访问频繁的表,将其分为若干个表

比如对于某网站平台的数据库表-公司表,数据量很大,这种能预估出来的大数据量表,我们就事先分出个N个表,这个N是多少,根据实际情况而定。

     某网站现在的数据量至多是5000万条,可以设计每张表容纳的数据量是500万条,也就是拆分成10张表,

那么如何判断某张表的数据是否容量已满呢?可以在程序段对于要新增数据的表,在插入前先做统计表记录数量的操作,当<500万条数据,就直接插入,当已经到达阀值,可以在程序段新创建数据库表(或者已经事先创建好),再执行插入操作。

 4. 利用merge存储引擎来实现分表

如果要把已有的大数据量表分开比较痛苦,最痛苦的事就是改代码,因为程序里面的sql语句已经写好了。用merge存储引擎来实现分表, 这种方法比较适合.

举例子:

 

 ------------------- ----------华丽的分割线--------------------------------------

 数据库架构

1、简单的MySQL主从复制:

MySQL的主从复制解决了数据库的读写分离,并很好的提升了读的性能,其图如下:

 

其主从复制的过程如下图所示:

 

但是,主从复制也带来其他一系列性能瓶颈问题:

1. 写入无法扩展

2. 写入无法缓存

3. 复制延时

4. 锁表率上升

5. 表变大,缓存率下降

那问题产生总得解决的,这就产生下面的优化方案,一起来看看。

2、MySQL垂直分区

   如果把业务切割得足够独立,那把不同业务的数据放到不同的数据库服务器将是一个不错的方案,而且万一其中一个业务崩溃了也不会影响其他业务的正常进行,并且也起到了负载分流的作用,大大提升了数据库的吞吐能力。经过垂直分区后的数据库架构图如下:

 

然而,尽管业务之间已经足够独立了,但是有些业务之间或多或少总会有点联系,如用户,基本上都会和每个业务相关联,况且这种分区方式,也不能解决单张表数据量暴涨的问题,因此为何不试试水平分割呢?

3、MySQL水平分片(Sharding)

这是一个非常好的思路,将用户按一定规则(按id哈希)分组,并把该组用户的数据存储到一个数据库分片中,即一个sharding,这样随着用户数量的增加,只要简单地配置一台服务器即可,原理图如下:

 

如何来确定某个用户所在的shard呢,可以建一张用户和shard对应的数据表,每次请求先从这张表找用户的shard id,再从对应shard中查询相关数据,如下图所示:

 


本文转载自:http://blog.csdn.net/zengfuqing/article/details/14466745

凯文加内特
粉丝 341
博文 699
码字总数 110557
作品 0
青岛
后端工程师
私信 提问
加载中

评论(10)

绝源体
绝源体

引用来自“迷途蜗牛”的评论

垂直分库怎么解决 join 问题?如文中所提,大部分表都会依赖 user_id
那就考虑水平拆分。
迷途蜗牛
迷途蜗牛
垂直分库怎么解决 join 问题?如文中所提,大部分表都会依赖 user_id
dk900912
dk900912
垂直拆分,豁然开朗。
wenweihu86
wenweihu86
uid非常多时,sharding manager单机扛不住了,怎么办?
火亮
火亮

引用来自“凯文加内特”的评论

引用来自“程序猿Zz”的评论

分库分表散列算法有什么好的实现方案么?负载增加的时候需要新增节点,如何新增加节点后不影响原来的数据查询呢?

没实践过
增减节点后并不会影响原有数据查询,因为已经用了一个专门的sharding manager记录uid与shardingid的对应关系,对应关系一经分配就不会改变。
凯文加内特
凯文加内特 博主

引用来自“程序猿Zz”的评论

分库分表散列算法有什么好的实现方案么?负载增加的时候需要新增节点,如何新增加节点后不影响原来的数据查询呢?

没实践过
程序猿Zz
分库分表散列算法有什么好的实现方案么?负载增加的时候需要新增节点,如何新增加节点后不影响原来的数据查询呢?
skanda
skanda
写的还行,
藏剑丶
藏剑丶
主从现实情况并不是那么好。个人感觉缓冲表更好点,开销也会大点
gamal_zf
gamal_zf
谢谢,很不错13
Hibernate 分库分表

调研了一下基于 Hibernate 的分库分表实现方法,发现很难。曾经 Hibernate 社区提供了一个分库分表项目 —— Hibernate Shards,但是现在已经不维护了。这恐怕也从侧面印证了基于 Hibernate ...

编走编想
2016/06/12
582
0
数据库之架构:主备+分库?主从+读写分离?

一、数据库架构原则 高可用 高性能 一致性 扩展性 二、常见的架构方案 方案一:主备架构,只有主库提供读写服务,备库冗余作故障转移用    jdbc:mysql://vip:3306/xxdb 高可用分析:高可用...

尜尜人物
2018/08/07
0
0
分库分表事宜

分库分表概念 按字面解释,分库是把原本存储于一个库的数据分块存储到多个库上,分表是把原本存储于一个表的数据分块存储到多个表上。 合理的分库可以降低单台服务器的负载压力,合理的分表可...

wangshuaixin
2016/12/18
135
2
不要NoSQL/NewSQL,也不要分区,直接分库分表!

每个优秀的程序员和架构师都应该掌握分库分表,这是我的观点。 移动互联网时代,海量的用户每天产生海量的数量,比如: 用户表 订单表 交易流水表 以支付宝用户为例,8亿;微信用户更是10亿。...

阿飞的博客
06/03
0
0
方案虽好,成本先行:数据库Sharding+Proxy实践解析

作者介绍 在谈论数据库架构演变和优化时,我们经常会听到分片、分库分表(Sharding)这样的关键词,在很长一段时间内,在各个公司、各中技术论坛里都很热衷谈论各种分片方案,尤其是互联网非...

房晓乐
2017/12/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Docker常用命令小记

除了基本的<font color="blue">docker pull</font>、<font color="blue">docker image</font>、<font color="blue">docker ps</font>,还有一些命令及参数也很重要,在此记录下来避免遗忘。 ......

程序员欣宸
昨天
3
0
MAT使用-jvm内存溢出问题分析定位

1.MAT简介: MAT 全称 Eclipse Memory Analysis Tools 是一个分析 Java堆数据的专业工具,可以计算出内存中对象的实例数量、占用空间大小、引用关系等,看看是谁阻止了垃圾收集器的回收工作,...

xiaomin0322
昨天
4
0
内网和外网之间的通信(端口映射原理)

首先解释一下“内网”与“外网”的概念: 内网:即所说的局域网,比如学校的局域网,局域网内每台计算机的IP地址在本局域网内具有互异性,是不可重复的。但两个局域网内的内网IP可以有相同的...

Jack088
昨天
5
0
3.深入jvm内核-原理、诊断与优化-4. GC算法和种类

一、GC算法和种类 GC的概念 GC算法 引用计数法 标记清除 标记压缩 复制算法 可触及性 Stop-The-World GC的对象是堆空间和永久区 引用计数法 老牌垃圾回收算法 通过引用计算来回收垃圾 使用者...

hexiaoming123
昨天
4
0
MySQL中的哈希索引

Memory中的哈希索引 哈希索引是基于哈希表实现的,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码,哈希码是一个较小的值,并且不同键值的...

我的眼里只有眼屎
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部