数据库建表分区partitionbyid是根据什么原理

数据库建表分区partitionbyid是根据什么原理,第1张

数据库建表分区partitionbyid根据原理

Mysql 的分区技术与水平分表有点类似, 但是它是在逻辑层进行的水平分表, 对于应用而言它还是一张表, 换句话说: 分区不是实际真正的对一张表进行拆分,分区之后表还是一个表,它是把存储文件进行拆分。

在 Mysql 51(后) 有了几种分区类型:

RANGE分区: 基于属于一个给定连续区间的列值, 把多行分配给分区

LIST分区: 类似于按 RANGE 分区, 区别在于 LIST 分区是基于列值匹配一个离散值集合中的某个值来进行选择

HASH分区: 基于用户定义的表达式的返回值来进行选择分区, 该表达式使用将要插入到表中的这些行的列值进行计算, 这个函数可以包含 Mysql 中有效的、产生非负整数值的任何表达式

KEY分区: 累世于按 HASH 分区, 区别在于 KEY 分区只支持计算一列或多列, 且 Mysql 服务器提供其自身的哈希函数

新一代MySQL产品---MySQL55 已经面世,较之之前的51版本,将获得诸多特性方面的提升,简单总结如下:

1 默认存储引擎更改为InnoDB

InnoDB作为成熟、高效的事务引擎,目前已经广泛使用,但MySQL51之前的版本默认引擎均为MyISAM,此次MySQL55终于 做到与时俱进,将默认数据库存储引擎改为InnoDB,并且引进了Innodb plugin 107。此次更新对数据库的好处是显而易见的:InnoDB的数据恢复时间从过去的一个甚至几个小时,缩短到几分钟(InnoDB plugin 107,InnoDB plugin 11, 恢复时采用红-黑树)。InnoDB Plugin 支持数据压缩存储,节约存储,提高内存命中率,并且支持adaptive flush checkpoint, 可以在某些场合避免数据库出现突发性能瓶颈。

Multi Rollback Segments: 原来InnoDB只有一个Segment,同时只支持1023的并发。现已扩充到128个Segments,从而解决了高并发的限制。

2 多核性能提升

Metadata Locking (MDL) Framework替换LOCK_open mutex (lock),使得MySQL51及过去版本在多核心处理器上的性能瓶颈得到解决,官方表示将继续增强对MySQL多处理器支持,直至MySQL性能 “不受处理器数量的限制”

3 复制功能(Replication)加强

MySQL复制特性是互联网公司应用非常广泛的特性,作为MySQL最实用最简单的扩展方式,过去的异步复制方式已经有些不上形势,对某些用户 来说“异步复制”意味着极端情况下的数据风险,MySQL55将首次支持半同步(semi-sync replication)在MySQL的高可用方案中将产生更多更加可靠的方案。另外Slave fsync tunning;Relay log corruption recovery和Replication Heartbeat也将实现

4 增强表分区功能

MySQL 55的分区对用户绝对是个好消息,更易于使用的增强功能,以及TRUNCATE PARTITION命令都可以为DBA节省大量的时间,有时对最终用户亦如此:

1) 非整数列分区:任何使用过MySQL分区的人应该都遇到过不少问题,特别是面对非整数列分区时,MySQL 51只能处理整数列分区,如果你想在日期或字符串列上进行分区,你不得不使用函数对其进行转换。很麻烦,而MySQL 55中新增了两类分区方法,RANG和LIST分区法,同时在新的函数中增加了一个COLUMNS关键词。在MySQL 51中使用分区另一个让人头痛的问题是date类型(即日期列),你不能直接使用它们,必须使用YEAR或TO_DAYS转换这些列,但在MySQL 55中情况发生了很大的变化,现在在日期列上可以直接分区,并且方法也很简单;

2) 多列分区:COLUMNS关键字现在允许字符串和日期列作为分区定义列,同时还允许使用多个列定义一个分区;

3) 可用性增强:truncate分区。分区最吸引人的一个功能是瞬间移除大量记录的能力,DBA都喜欢将历史记录存储到按日期分区的分区表中,这样可以定期 删除过时的历史数据。 但当你需要移除分区中的部分数据时,事情就不是那么简单了,删除分区没有问题,但如果是清空分区,就很头痛了,要移除分区中的所有 数据,但需要保留分区本身,你可以:使用DELETE语句,但我们知道DELETE语句的性能都很差。使用DROP PARTITION语句,紧跟着一个EORGANIZE PARTITIONS语句重新创建分区,但这样做比前一个方法的成本要高出许多。MySQL 55引入了TRUNCATE PARTITION,它和DROP PARTITION语句有些类似,但它保留了分区本身,也就是说分区还可以重复利用。TRUNCATE PARTITION应该是DBA工具箱中的必备工具;

4) 更多微调功能:TO_SECONDS:分区增强包有一个新的函数处理DATE和DATETIME列,使用TO_SECONDS函数,你可以将日期/时间列转换成自0年以来的秒数,如果你想使用小于1天的间隔进行分区,那么这个函数就可以帮到你。

5 Insert Buffering 如果在buffer pool中没找到数据,那么直接buffer起来,避免额外的IO;Delete & Purge Buffering 跟插入一样,如果buffer pool中没有命中,先buffer起来,避免额外的IO。

6 Support for Native AIO on Linux

以上的特性在MySQL 55的社区版当中都将包括,在MySQL企业版当中,除以上更新之外,Oracle还加强了更多实用的企业级功能,包括:

1 实现在线物理热备

MySQL 企业版将包含Innodb Hotbackup(这也许是MySQL和InnDB多年之后重新聚首的新亮点),从而一举解决过去MySQL无法进行可靠的在线实时物理备份的问题, InnoDB Hot Backup 不需要你关闭你的服务器也不需要加任何锁或影响其它普通的数据 *** 作,这对MySQL DBA来说应该是一个不错的消息。

2 MySQL Enterprise Monitor 22 & Oracle Enterprise Monitor

是的,你没有看错,MySQL将可以被Oracle Enterprise Monitor监控,这是一个实现起来并不复杂,但在过去绝无可能的变化。并且MySQL企业版监控器(MySQL Enterprise Monitor)得到了更大的加强,版本更新至22,对MySQL服务器资源占用降低到可以忽略的地步,集成了监控,报警,SQL语句分析和给出优化建 议,MySQL的一些开源监控方案相比之下显得过于简陋,对企业客户来说,MySQL变得更加可靠。

3 MySQL Workbench

过去MySQL的图形界面工具做的实在是令人难以恭维,当然这也给众多MySQL管理工具提供了市场空间,现在Oracle打算将MySQL做 得比SQL-Server更加简单易用,MySQL Workbench是一款专为MySQL设计的ER/数据库建模工具,可以用来设计和创建新的数据库图示,建立数据库文档,以及进行复杂的MySQL 迁移等 *** 作,因此内置workbench将使MySQL使用起来更简便高效。

4 关于未来的重要提醒:Oracle的管理工具,MySQL也将能够使用,当然MySQL 55我们还没看到这个变化,但变化已经在时间表上,MySQL社区版也能够被Oracle管理工具管理,前提你得是Oracle数据库的用户。

对于高斯数据库而言,一个列存表只能同时使用Partial、Cluster和Key三种方式进行创建。这是因为Partial、Cluster和Key都是高斯数据库中非常重要的概念,它们各自具有不同的作用和特点,可以在不同场景下发挥重要作用。

Partial是高斯数据库中对于数据进行分区的一种方式,通过将数据划分为多个子集,可以提高查询效率,降低系统负载压力。

Cluster是指将表按照某个列进行聚类,将相似的记录放在一起存储,可以提高查询效率,减少IO *** 作次数。

Key则是指表中的关键字,可以用来唯一标识每条记录,也可以用来建立索引,提高查询效率。

由于Partial、Cluster和Key各自具有不同的作用和特点,在实际应用中需要根据需求进行选择,不能同时使用多种方式进行创建。因此,在高斯数据库中,一个列存表只能创建Partial+Cluster+Key或者任意两种方式的组合,而不能同时使用三种方式进行创建。

1 组合分区表的创建方式("范围-哈稀"),见附1

2 楼主的需求,即"范围-范围分区",在ORACLE 9i, 10g经过测试都是不能实现的

在附1的基础上修改为"范围-范围"组合分区,创建时报错:ORA-14151:无效的表分区方法

3 关于sxdtgsh兄的回答,我测了

31 没有maxvalue上限分区设置,在插入超出分区的数据时会报错ORA-14400: 插入的分区关键字未映射到任何分区

32 按回答的语句创建分区表没有问题,但数据无法按照楼主的需求分布

====附1

附录:创建"范围-哈稀"组合分区表

CREATE TABLE TAB11 (ID NUMBER,DT DATE)

PARTITION BY RANGE (DT)

SUBPARTITION BY HASH (ID) SUBPARTITIONS 2 -- 自分区个数,可以不写,由系统判断

(

PARTITION Y2012 VALUES LESS THAN (TO_DATE('2013-01-01','YYYY-MM-DD'))

(

SUBPARTITION Y2012_H1

,SUBPARTITION Y2012_H2

)

,PARTITION Y2013 VALUES LESS THAN (TO_DATE('2014-01-01','YYYY-MM-DD'))

(

SUBPARTITION Y2013_H1

,SUBPARTITION Y2013_H2

)

,PARTITION YMAX VALUES LESS THAN (MAXVALUE)

(

SUBPARTITION YMAX_H1

,SUBPARTITION YMAX_H2

)

)

====附2,请楼主检查最后查询的数据分布

create table T_TEST

(

ID NUMBER(20) NOT NULL,

TIME DATE NOT NULL

)

partition by range(TIME, ID) -- 按时间、ID范围分区 这个例子是按年的

(

partition P_2012_10 values less than (to_date('2013-01-01','yyyy-MM-dd'), 10),

partition P_2012_20 values less than (to_date('2013-01-01','yyyy-MM-dd'), 20),

partition P_2012_MAX values less than (to_date('2013-01-01','yyyy-MM-dd'), MAXVALUE),

partition P_2013_10 values less than (to_date('2014-01-01','yyyy-MM-dd'), 10),

partition P_2013_20 values less than (to_date('2014-01-01','yyyy-MM-dd'), 20),

partition P_2013_MAX values less than (to_date('2014-01-01','yyyy-MM-dd'), MAXVALUE),

partition P_MAX values less than (MAXVALUE,MAXVALUE)

);

INSERT INTO T_TEST VALUES (1,TO_DATE('20121204 00:00:00','YYYYMMDD HH24:MI:SS'));

INSERT INTO T_TEST VALUES (12,TO_DATE('20121204 00:00:00','YYYYMMDD HH24:MI:SS'));

INSERT INTO T_TEST VALUES (32,TO_DATE('20121204 00:00:00','YYYYMMDD HH24:MI:SS'));

INSERT INTO T_TEST VALUES (2,TO_DATE('20131204 00:00:00','YYYYMMDD HH24:MI:SS'));

INSERT INTO T_TEST VALUES (12,TO_DATE('20131204 00:00:00','YYYYMMDD HH24:MI:SS'));

INSERT INTO T_TEST VALUES (33,TO_DATE('20131204 00:00:00','YYYYMMDD HH24:MI:SS'));

INSERT INTO T_TEST VALUES (3,TO_DATE('20141204 00:00:00','YYYYMMDD HH24:MI:SS'));

INSERT INTO T_TEST VALUES (23,TO_DATE('20141204 00:00:00','YYYYMMDD HH24:MI:SS'));

INSERT INTO T_TEST VALUES (43,TO_DATE('20151204 00:00:00','YYYYMMDD HH24:MI:SS'));

SELECT FROM T_TEST;

SELECT FROM T_TEST PARTITION(P_2012_10);

SELECT FROM T_TEST PARTITION(P_2012_20);

SELECT FROM T_TEST PARTITION(P_2012_MAX);

SELECT FROM T_TEST PARTITION(P_2013_10);

SELECT FROM T_TEST PARTITION(P_2013_20);

SELECT FROM T_TEST PARTITION(P_2013_MAX);

SELECT FROM T_TEST PARTITION(P_MAX);

链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一个上限值。以太网的MTU是1500,你可以用 netstat -i 命令查看这个值。如果IP层有数据包要传,而且数据包的长度超过了MTU,那么IP层就要对数据包进行分(fragmentation) *** 作,使每一片的长度都小于或等于MTU。我们假设要传输一个UDP数据包,以太网的MTU为1500字节,一般IP首部为20字节,UDP首部为8字节,数据的净荷(payload)部分预留是1500-20-8=1472字节。如果数据部分大于1472字节,就会出现分片现象。

分片(sharding)是数据库分区的一种,它将大型数据库分成更小、更快、更容易管理的部分,这些部分叫做数据碎片。碎片这个词意思就是整体的一小部分。

Jason Tee表示:“简言之,分片(sharding)数据库需要将数据库(database)分成多个没有共同点的小型数据库,且它们可以跨多台服务器传播。”

技术上来说,分片(sharding)是水平分区的同义词。在实际 *** 作中,这个术语常用来表示让一个大型数据库更易于管理的所有数据库分区。

分片(sharding)的核心理念基于一个想法:数据库大小以及数据库上每单元时间内的交易数呈线型增长,查询数据库的响应时间(response time)以指数方式增长。

另外,在一个地方创建和维护一个大型数据库的成本会成指数增长,因为数据库将需要高端的计算机。相反地,数据碎片可以分布到大量便宜得多的商用服务器上。就硬件和软件要求而言,数据碎片相对来说没什么限制。

在某些情况中,数据库分片(sharding)可以很简单地完成。按地理位置拆分用户数据库就是一个常见的例子。位于东海岸的用户被分到一台服务器上,在西海岸的用户被分在另一台服务器上。假设没有用户有多个地理位置,这种分区很易于维护和创建规则。

但是数据分片(sharding)在某些情况下会是更为复杂的过程。例如,一个数据库持有很少结构化数据,分片它就可能非常复杂,并且结果碎片可能会很难维护。

分片过程

对于发送端发送的每份IP数据报来说,其标识字段都包含一个唯一值。该值在数据报分片时被复制到每个片中。标志字段用其中一个比特来表示“更多的片”。除了最后一片外,其他每个组成数据报的片都要把该比特置1。片偏移字段指的是该片偏移原始数据报开始处的位置。另外,当数据报被分片后,每个片的总长度值要改为该片的长度值。

最后,标志字段中有一个比特称作“不分片”位。如果将这一比特置1,IP将不对数据报进行分片。相反把数据报丢弃并发送一个ICMP差错报文给起始端。

当IP数据报被分片后,每一片都成为一个分组,具有自己的IP首部,并在选择路由时与其他分组独立。这样,当数据报的这些片到达目的端时有可能会失序,但是在IP首部中有足够的信息让接收端能正确组装这些数据报片。

说明:hive 的表存放位置模式是由 hive-sitexml 当中的一个属性指定的,默认是存放在该配置文件设置的路径下,也可在创建数据库时单独指定存储路径。

数据库有一些描述性的属性信息,可以在创建时添加:

查看数据库的键值对信息

修改数据库的键值对信息

与mysql查询语句是一样的语法

删除一个空数据库,如果数据库下面有数据表,那么就会报错

强制删除数据库,包含数据库下面的表一起删除(请谨慎 *** 作)

[]里的属性为可选属性,不是必须的,但是如果有可选属性,会使 sql 语句的易读性更好,更标准与规范。

例如:[comment '字段注释信息'][comment '表的描述信息']等,[external]属性除外

1 CREATE TABLE

创建一个指定名字的表,如果相同名字的表已存在,则抛出异常提示:表已存在,使用时可以使用IF NOT EXISTS语句来忽略这个异常。

如果创建的表名已存在,则不会再创建,也不会抛出异常提示:表已存在。否则则自动创建该表。

2 EXTERNAL

顾名思义是外部的意思,此关键字在建表语句中让使用者可以创建一个外部表,如果不加该关键字,则默认创建内部表。

外部表在创建时必须同时指定一个指向实际数据的路径(LOCATION),Hive在创建内部表时,会将数据移动到数据仓库指向的路径;

若创建外部表,仅记录数据所在的路径,不对数据的位置作任何改变。

内部表在删除后,其元数据和数据都会被一起删除。

外部表在删除后,只删除其元数据,数据不会被删除。

3 COMMENT

用于给表的各个字段或整张表的内容作解释说明的,便于他人理解其含义。

4 PARTITIONED BY

区分表是否是分区表的关键字段,依据具体字段名和类型来决定表的分区字段。

5 CLUSTERED BY

依据column_name对表进行分桶,在 Hive 中对于每一张表或分区,Hive 可以通过分桶的方式将数据以更细粒度进行数据范围划分。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。

6 SORTED BY

指定表数据的排序字段和排序规则,是正序还是倒序排列。

7 ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '

指定表存储中列的分隔符,这里指定的是' ',也可以是其他分隔符。

8 STORED AS SEQUENCEFILE|TEXTFILE|RCFILE

指定表的存储格式,如果文件数据是纯文本格式,可以使用STORED AS TEXTFILE,如果数据需要压缩,则可以使用STORED AS SEQUENCEFILE。

9 LOCATION

指定 Hive 表在 hdfs 里的存储路径,一般内部表(Managed Table)不需要自定义,使用配置文件中设置的路径即可。

如果创建的是一张外部表,则需要单独指定一个路径。

1 使用create table语句创建表

例子:

2 使用create table as select语句创建表

例子:

使用 create table as select 语句来创建新表sub_student,此时sub_student 表的结构及表数据与 t_student 表一模一样, 相当于直接将 t_student 的表结构和表数据复制一份到 sub_student 表。

注意:

(1) select 中选取的列名(如果是 则表示选取所有列名)会作为新表 sub_student 的列名。

(2) 该种创建表的方式会改变表的属性以及结构,例如不能是外部表,只能是内部表,也不支持分区、分桶。

如果as select后的表是分区表,并且使用select ,则分区字段在新表里只是作为字段存在,而不是作为分区字段存在。

在使用该种方式创建时,create 与 table 之间不能加 external 关键字,即不能通过该种方式创建外部目标表,默认只支持创建内部目标表。

(3) 该种创建表的方式所创建的目标表存储格式会变成默认的格式textfile。

3使用like语句创建表

例子:

注意:

(1) 只是将 t_student 的表结构复制给 sub1_student 表。

(2) 并不复制 t_student 表的数据给 sub1_student 表。

(3) 目标表可以创建为外部表,即:

以上就是关于数据库建表分区partitionbyid是根据什么原理全部的内容,包括:数据库建表分区partitionbyid是根据什么原理、支持mysql分区表的版本有哪些、高斯DB一个列存只能创建partial+cluster+key吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9438000.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存