1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > MySql数据库分区和分表方法的详解及分区和分表介绍

MySql数据库分区和分表方法的详解及分区和分表介绍

时间:2021-01-16 11:12:48

相关推荐

MySql数据库分区和分表方法的详解及分区和分表介绍

数据库|mysql教程

MySql,分区,分表

数据库-mysql教程

这篇文章主要为大家详细介绍了MySql数据库分区和分表方法,告诉大家什么是分表和分区,mysql分表和分区有什么联系,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

变速精灵源码,vscode 中文编码,ubuntu系统深度学习搭建,Tomcat实现ssl,sqlite中间插入字段,pc轮播图插件,前端桌面端框架electron,python爬虫所用技术,php注册与登录,英文seo公司,网站订货系统源码,div 在网页中插入透明flash背景,国外模板之家,单独介绍页面手机版源码,H5租房管理系统源码,有没有开源的淘宝客程序lzw

1、为什么要分表和分区

vip解析app源码在线支付,ubuntu本地源镜像,tomcat控制台打印原理,scrapy爬虫名字,php设计在线教程学习,贵州seo方式lzw

日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕。分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。

js动画网站源码下载,UBUNTU手机支架便携,爬虫好友公众号,php 大神课堂,太原正规seolzw

2、什么是分表和分区

2.1 分表

分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。app读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它。

2.2 分区

分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候操作的还是大表名字,db自动去组织分区的数据。

分区的主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。

2.3 mysql分表和分区有什么联系呢?

1)、都能提高mysql的性能,在高并发状态下都有一个良好的表现。

2)、分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式,访问量不大,但是表数据很多的表,我们可以采取分区的方式等。

3)、分表技术是比较麻烦的,需要手动去创建子表,app服务端读写时候需要计算子表名。采用merge好一些,但也要创建子表和配置子表间的union关系。

4)、表分区相对于分表,操作方便,不需要创建子表。

3、分表的几种方式

3.1 mysql集群

它并不是分表,但起到了和分表相同的作用。集群可分担数据库的操作次数,将任务分担到多台数据库上。集群可以读写分离,减少读写压力。从而提升数据库性能。

3.2 自定义规则分表

大表可以按照业务的规则来分解为多个子表。通常为以下几种类型,也可自己定义规则。

Range(范围)–这种模式允许将数据划分不同范围。例如可以将一个表通过年份划分成若干个分区。

Hash(哈希)–这中模式允许通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。例如可以建立一个对表主键进行分区的表。

Key(键值)–上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的。

List(预定义列表)–这种模式允许系统通过预定义的列表的值来对数据进行分割。

Composite(复合模式)–以上模式的组合使用

分表规则与分区规则一样,在分区模块详细介绍。

下面以Range简单介绍下如何分表(按照年份表)。

假设表结构有4个字段:自增id,姓名,存款金额,存款日期

把存款日期作为规则分表,分别创建几个表

:account_

:account_

……

:account_

app在读写的时候根据日期来查找对应的表名,需要手动来判定。

var getTableName = function() { var data = { name: om, money: 2800.00, date: 10013059 }; var tablename = account_; var year = parseInt(data.date.substring(0, 4)); if (year < ) { tablename += ; // account_ } else if (year < ) { tablename += ; // account_ } else if (year < ) { tablename += ; // account_ } else if (year < ) { tablename += ; // account_ } else { tablename += ; // account_ } return tablename;}

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

merge分表,分为主表和子表,主表类似于一个壳子,逻辑上封装了子表,实际上数据都是存储在子表中的。

我们可以通过主表插入和查询数据,如果清楚分表规律,也可以直接操作子表。

子表

CREATE TABLE `account_` (`id` int(11) NOT NULL AUTO_INCREMENT ,`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,`money` float NOT NULL ,`tradeDate` datetime NOT NULLPRIMARY KEY (`id`))ENGINE=MyISAMDEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ciAUTO_INCREMENT=2CHECKSUM=0ROW_FORMAT=DYNAMICDELAY_KEY_WRITE=0;

子表

CREATE TABLE `account_` (`id` int(11) NOT NULL AUTO_INCREMENT ,`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,`money` float NOT NULL ,`tradeDate` datetime NOT NULLPRIMARY KEY (`id`))ENGINE=MyISAMDEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ciAUTO_INCREMENT=2CHECKSUM=0ROW_FORMAT=DYNAMICDELAY_KEY_WRITE=0;

主表,所有年

CREATE TABLE `account_all` (`id` int(11) NOT NULL AUTO_INCREMENT ,`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,`money` float NOT NULL ,`tradeDate` datetime NOT NULLPRIMARY KEY (`id`))ENGINE=MRG_MYISAMDEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ciUNION=(`account_`,`account_`)INSERT_METHOD=LASTROW_FORMAT=DYNAMIC;

创建主表的时候有个INSERT_METHOD,指明插入方式,取值可以是:0 不允许插入;FIRST 插入到UNION中的第一个表; LAST 插入到UNION中的最后一个表。

通过主表查询的时候,相当于将所有子表合在一起查询。这样并不能体现分表的优势,建议还是查询子表。

4、分区的几种方式

4.1 Range

create table range( id int(11), money int(11) unsigned not null, date datetime )partition by range(year(date))( partition p values less than (), partition p values less than (), partition p values less than () partition p values less than maxvalue );

4.2 List

create table list( a int(11), b int(11) )(partition by list (b) partition p0 values in (1,3,5,7,9), partition p1 values in (2,4,6,8,0) );

4.3 Hash

create table hash( a int(11), b datetime )partition by hash (YEAR(b) partitions 4;

4.4 key

create table t_key( a int(11), b datetime) partition by key (b) partitions 4;

4.5 分区管理

4.5.1 新增分区

ALTER TABLE sale_dataADD PARTITION (PARTITION p10 VALUES LESS THAN (11));

4.5.2 删除分区

当删除了一个分区,也同时删除了该分区中所有的数据。

ALTER TABLE sale_data DROP PARTITION p10;

4.5.3 合并分区

下面的SQL,将p01 – p09 合并为3个分区pQ1 – pQ3

ALTER TABLE sale_dataREORGANIZE PARTITION p01,p02,p03,p04,p05,p06,p07,p08,p09 INTO(PARTITION pQ1 VALUES LESS THAN (04),PARTITION pQ2 VALUES LESS THAN (07),PARTITION pQ3 VALUES LESS THAN (10));

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。