数据库分区 数据库分区和分表的区别
大家好,今天来为大家解答数据库分区这个问题的一些问题点,包括数据库分区和分表的区别也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
数据库分区和分表的区别
分区、分表、分库的详细理解
一、什么是分区、分表、分库
分区
就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的
分表
就是把一张表按一定的规则分解成N个具有独立存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它。
分库
一旦分表,一个库中的表会越来越多
将整个数据库比作图书馆,一张表就是一本书。当要在一本书中查找某项内容时,如果不分章节,查找的效率将会下降。而同理,在数据库中就是分区。
二、常用的单机数据库的瓶颈
问题描述
单个表数据量越大,读写锁,插入操作重新建立索引效率越低。
单个库数据量太大(一个数据库数据量到就是极限)
单个数据库服务器压力过大
读写速度遇到瓶颈(并发量几百)
三、分区
什么时候考虑使用分区?
一张表的查询速度已经慢到影响使用的时候。
sql经过优化
数据量大
表中的数据是分段的
对数据的操作往往只涉及一部分数据,而不是所有的数据
分区解决的问题
主要可以提升查询效率
分区的实现方式(简单)
mysql5开始支持分区功能
四、分表
什么时候考虑分表?
一张表的查询速度已经慢到影响使用的时候。
sql经过优化
数据量大
当频繁插入或者联合查询时,速度变慢
分表解决的问题
分表后,单表的并发能力提高了,磁盘I/O性能也提高了,写操作效率提高了
查询一次的时间短了
数据分布在不同的文件,磁盘I/O性能提高
读写锁影响的数据量变小
插入数据库需要重新建立索引的数据减少
分表的实现方式(复杂)
需要业务系统配合迁移升级,工作量较大
分区和分表的区别与联系
分区和分表的目的都是减少数据库的负担,提高表的增删改查效率。
分区只是一张表中的数据的存储位置发生改变,分表是将一张表分成多张表。
当访问量大,且表数据比较大时,两种方式可以互相配合使用。
当访问量不大,但表数据比较多时,可以只进行分区。
常见分区分表的规则策略(类似)
Range(范围)
Hash(哈希)
按照时间拆分
Hash之后按照分表个数取模
在认证库中保存数据库配置,就是建立一个DB,这个DB单独保存user_id到DB的映射关系
MS Sql Server数据库分区
什么是数据库分区?
数据库分区是一种对表的横向分割 Sql server企业版和之后的Sql server版本才提供这种技术这种对表的横向分割不同于中的表分割它对访问用户是透明的用户并不会感觉的表被横向分割了(中的表横向分割是建n个表例如按时间建表每月一个表表名不同最后需要做一个大视图)
为什么要分区?
显而易见分区是为了提高数据库的读写性能提高数据库的效率
分区是否总是可以提高效率?
分区是一把双刃剑并不总能提高效率这和具体情况有关系
之所以有分区技术分区技术用的好的话可以提高性能是因为一方面分区把一大块数据分成了n小块这样查询的时候很快定位到某一小块上在小块中寻址要快很多另一方面CPU比磁盘IO快很多倍而硬件上又有多个磁盘或者是RAID(廉价磁盘冗余阵列)可以让数据库驱动CPU同时去读写不同的磁盘这样才有可能可以提高效率
分区在有些时候并不能提高读写效率比如说我们经常看到的按照日期字段去分区MSDN例子这个实例中是按照记录的生成时间来分区的把一年的数据分割成个分区每月一个这样的分区导致分区并不能实现CPU同步写并提高写入性能因为在同一个时段CPU总是要写入到最新的那一个分区对应的磁盘中另一个问题是这样分区是否可以提高读取性能呢?答案是不一定要看根据什么字段来查询如果是根据时间来查询根据时间生成报表那么这种分区肯定会提高查询的效率但是如果是按照某个客户查询客户最近年内的账单数据这样数据分布到不同的分区上这样的话效率就不一定能提高了这要看数据在同一个分区上连续分布的读性能高还是CPU从几个磁盘上同步读取然后在合并数据的性能更高一些这和读取数据的记录数也有关系
如何分区?用什么字段做分区依据?
具体如何分区和涉及的业务有关系要看业务上最经常的写入和读取操作是什么然后再考虑分区的策略
既然与具体业务相关我们就假定一个业务环境假如我们要做一个论坛对论坛的帖子和回复表进行分区
论坛中最常见的写操作是)发帖)回复帖子最常见的读操作是
)根据帖子id显示帖子详情和分页的帖子回复)根据帖子版面帖子列表页根据版面id分页读取帖子列表数据
怎么分区更合适呢?现在还没有准确答案我有两种可能的方案写下来大家讨论看看
方案根据帖子ID区域段分区( w一个分区 w w一个分区…)这样理论上可以提高帖子详细页的读取速度而对于写操作性能没有益处对于根据版面id读取帖子列表页有可能有益
方案根据版面id进行分区这样对于写性能应该有提高不同的分区对应不同的版面当有两个版面同时有发帖回帖操作时有可能可以并发写对于根据版面id获得帖子列表页数据也可以提高性能而对于帖子详细信息页没有性能影响
多大的数据量才需要分区?
lishixinzhi/Article/program/SQLServer/201311/22473什么是分表和分区MySql数据库分区和分表方法
1、为什么要分表和分区
日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕。分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。
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,姓名,存款金额,存款日期
把存款日期作为规则分表,分别创建几个表
2011年:account_2011
2012年:account_2012
??
2015年:account_2015
app在读写的时候根据日期来查找对应的表名,需要手动来判定。
3.3利用merge存储引擎来实现分表
merge分表,分为主表和子表,主表类似于一个壳子,逻辑上封装了子表,实际上数据都是存储在子表中的。
我们可以通过主表插入和查询数据,如果清楚分表规律,也可以直接操作子表。
子表2011年
CREATE TABLE `account_2011`(
`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 NULL
PRIMARY KEY(`id`)
)
ENGINE=MyISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=2
CHECKSUM=0
ROW_FORMAT=DYNAMIC
DELAY_KEY_WRITE=0
;
子表2012年
CREATE TABLE `account_2012`(
`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 NULL
PRIMARY KEY(`id`)
)
ENGINE=MyISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=2
CHECKSUM=0
ROW_FORMAT=DYNAMIC
DELAY_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 NULL
PRIMARY KEY(`id`)
)
ENGINE=MRG_MYISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
UNION=(`account_2011`,`account_2012`)
INSERT_METHOD=LAST
ROW_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 p2007 values less than(2008),
partition p2008 values less than(2009),
partition p2009 values less than(2010)
partition p2010 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_data
ADD PARTITION(PARTITION p201010 VALUES LESS THAN(201011));
4.5.2删除分区
当删除了一个分区,也同时删除了该分区中所有的数据。
ALTER TABLE sale_data DROP PARTITION p201010;
4.5.3合并分区
下面的SQL,将p201001- p201009合并为3个分区p2010Q1- p2010Q3
ALTER TABLE sale_data
REORGANIZE PARTITION p201001,p201002,p201003,
p201004,p201005,p201006,
p201007,p201008,p201009 INTO
(
PARTITION p2010Q1 VALUES LESS THAN(201004),
PARTITION p2010Q2 VALUES LESS THAN(201007),
PARTITION p2010Q3 VALUES LESS THAN(201010)
);
好了,关于数据库分区和数据库分区和分表的区别的问题到这里结束啦,希望可以解决您的问题哈!