mysql分库分区分表

分表:

分表分为水平分表和垂直分表。

水平分表原理:

分表策略通常是用户ID取模,如果不是整数,可以首先将其进行hash获取到整。

水平分表遇到的问题:

1. 跨表直接连接查询无法进行

2. 我们需要统计数据的时候

3. 如果数据持续增长,达到现有分表的瓶颈,需要增加分表,此时会出现数据重新排列的情况

解决方案建议:

1. 第1,2点可以通过增加汇总的冗余表,虽然数据量很大,但是可以用于后台统计或者查询时效性比较底的情况,而且我们可以提前算好某个时间点或者时间段的数据

2. 第3点解决建议:

1. 可以开始的时候,就分析大概的数据增长率,来大概确定未来某段时间内的数据总量,从而提前计算出未来某段时间内需要用到的分表的个数

2. 考虑表分区,在逻辑上面还是一个表名,实际物理存储在不同的物理地址上

3. 分库

垂直拆分原则:

1. 把大字段独立存储到一张表中

2. 把不常用的字段单独拿出来存储到一张表

3. 把经常在一起使用的字段可以拿出来单独存储到一张表

垂直拆分标准:

1.表的体积大于2G并且行数大于1千万

2.表中包含有text,blob,varchar(1000)以上

3.数据有时效性的,可以单独拿出来归档处理

/*表的体积计算*/

CREATE TABLE `test1` (

id bigint(20) not null auto_increment,

detail varchar(2000),

createtime  datetime,

validity int default ‘0‘,

primary key (id)

);

1000万  bigint 8字节 varchar 2000 字节 datetime  8字节 validity 4字节

(8+2000+8+4) * 10000000 = 20200000000 字节 == 18G

分表后体积:

CREATE TABLE `test1` (

id int not null auto_increment,

createtime  timestamp,

validity tinyint default 0,

primary key (id)

);

(4+4+1) * 10000000 =  0.08G

分库策略与分表策略的实现很相似,最简单的都是可以通过取模的方式进行路由。

分库也可以按照业务分库,比如订单表和库存表在两个库,要注意处理好跨库事务。

分表和分库 同时实现。

分库分表的策略相对于前边两种复杂一些,一种常见的路由策略如下:

1、中间变量 = user_id%(库数量*每个库的表数量);

2、库序号 = 取整(中间变量/每个库的表数量);

3、表序号 = 中间变量%每个库的表数量;

例如:数据库有256 个,每一个库中有1024个数据表,用户的user_id=262145,按照上述的路由策略,可得:

1、中间变量 = 262145%(256*1024)= 1;

2、库序号 = 取整(1/1024)= 0;

3、表序号 = 1%1024 = 1;

这样的话,对于user_id=262145,将被路由到第0个数据库的第1个表中。

表分区:

就是将一个数据量比较大的表,用某种方法把数据从物理上分成若干个小表来存储(类似水平分表),从逻辑来看还是一个大表。分表最大分1024,一般分100左右比较适合。

使用场景:

对于这种数据库比较多,但是并发不是很多的情况下,可以采用表分区。

对于数据量比较大的,但是并发也比较高的情况下,可以采用分表和分区相结合。

/*range分区*/

create table test_range(

id int not null default 0

)engine=myisam default charset=utf8

partition by range(id)(

partition p1 values less than (3),

partition p2 values less than (5),

partition p3 values less than maxvalue

);

/*hash分区*/

create table test_hash(

id int not null default 0

)engine=innodb default charset=utf8

partition by hash(id) partitions 10;

/*线性hash分区*/

create table test_linear(

id int not null default 0

)engine=innodb default charset=utf8

partition by linear hash(id) partitions 10;

/* list分区*/

create table test_list(

id int not null

) engine=innodb default charset=utf8

partition by list(id)(

partition p0 values in (3,5),

partition p1 values in (2,6,7,9)

);

/* key 分区 */

CREATE TABLE test_key (

col1 INT NOT NULL

)

PARTITION BY  linear KEY (col1)

PARTITIONS 10;

普通的hash分区  增加风区后,需要重新计算

线性hash分区(了解)    增加分区后,还是在原来的分区

线性hash 相对于 hash分区 没有那么均匀

Key分区用的比较少,也是hash分区

原文地址:https://www.cnblogs.com/dawuge/p/10480483.html

时间: 2024-07-31 13:38:54

mysql分库分区分表的相关文章

MySql之分区分表

MySql之分区分表 分表的概念 分表:将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件.这些表可以分布在同一块磁盘上,也可以在不同的机器上.app读写的时候根据事先定义好的规则得到对应的表名,然后去操作它. 常用的算法:hash或求余(取模)等方式 分表的好处:减小数据库的负担,缩短查询时间 分表的类型:①垂直切分:是指数据表列的拆分,把一张列比较多的表拆分为多张表 ②水平拆分是指数据表行的拆分,把一张的表的

【分库、分表】MySQL分库分表方案

一.Mysql分库分表方案 1.为什么要分表: 当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间. mysql中有一种机制是表锁定和行锁定,是为了保证数据的完整性.表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行.行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作. 2. mysql proxy:amoeba 做mysql集群,利用amoeba. 从上层的ja

MySQL分库分表方案

1. MySQL分库分表方案 1.1. 问题: 1.2. 回答: 1.2.1. 最好的切分MySQL的方式就是:除非万不得已,否则不要去干它. 1.2.2. 你的SQL语句不再是声明式的(declarative) 1.2.3. 你招致了大量的网络延时 1.2.4. 你失去了SQL的许多强大能力 1.2.5. MySQL没有API保证异步查询返回顺序结果 1.2.6. 总结 MySQL分库分表方案 翻译一个stackoverflow上的问答,关于分库分表的缺点的,原文链接: MySQL shard

企业Shell实战-MySQL分库分表备份脚本

本文来自http://www.xuliangwei.com/xubusi/252.html 免费视频讲解见 http://edu.51cto.com/course/course_id-5064.html 企业Shell实战-MySQL分库分表备份 今天是2015年的最后一天,大家都开心的跨年,而我还在苦逼的呵呵-省略 此处内容来自老男孩教育oldboy以及老男孩26期王续精彩分享整理而来  为表示感谢,特整理此篇博文分享给大家! 项目联系笔者QQ:572891887   也可以加入架构师交流群:

OneProxy实现MySQL分库分表

OneProxy实现MySQL分库分表 简介 Part1:写在最前 随着网站的壮大,MySQL数据库架构一般会经历一个过程: 当我们数据量比较小的时候,一台单实例数据库足矣.等我们数据量增大的时候,我们会采用一主多从的数据库架构来降低我们的读写io.当我们某张业务表达到几百万上千万甚至上亿时,就应该去进行分表处理.本文演示OneProxy对数据库实现分表处理,对前端应用是透明的. Part2:环境简介 HE1:192.168.1.248 Master1 HE3:192.168.1.250 Mas

MYSQL分库分表

1 基本思想之什么是分库分表? 从字面上简单理解,就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上. 2 基本思想之为什么要分库分表? 数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据 操作,增删改查的开销也会越来越大:另外,由于无法进行分布式式部署,而一台服务器的资源(CPU.磁盘.内存.IO等)是有限的,最终数据库所能承载的 数据量.数据处理能力都将遭遇瓶颈.

MYSQL分库分表和不停机更改表结构

在MYSQL分库分表中我们一般是基于数据量比较大的时间对mysql数据库一种优化的做法,下面我简单的介绍一下mysql分表与分库的简单做法. 1.分库分表 很明显,一个主表(也就是很重要的表,例如用户表)无限制的增长势必严重影响性能,分库与分表是一个很不错的解决途径,也就是性能优化途径,现在的案例是我们有一个1000多万条记录的用户表members,查询起来非常之慢,同事的做法是将其散列到100个表中,分别从members0到members99,然后根据mid分发记录到这些表中,牛逼的代码大概是

(转)企业Shell实战-MySQL分库分表备份脚本

本文来自http://www.xuliangwei.com/xubusi/252.html 免费视频讲解见 http://edu.51cto.com/course/course_id-5064.html 企业Shell实战-MySQL分库分表备份 今天是2015年的最后一天,大家都开心的跨年,而我还在苦逼的呵呵-省略 此处内容来自老男孩教育oldboy以及老男孩26期王续精彩分享整理而来  为表示感谢,特整理此篇博文分享给大家! 项目联系笔者QQ:572891887   也可以加入架构师交流群:

实现MySQL分库分表备份的脚本

1)准备测试数据:通过写脚本批量建库建表并插入测试数据. [[email protected] scripts]# cat ceshi.sh #/bin/bash PATH="/usr/local/mysql/bin:$PATH"                 #定义mysql命令所在路径 MYUSER=root                                                     #定义数据用户名 DBPATH=/server/backup