数据库表分区
A. 数据库分区的分类
分区主要有两种形式://这里一定要注意行和列的概念(row是行,column是列)
水平分区(Horizontal Partitioning)
这种形式分区是对表的行进行分区,通过这样的方式不同分组里面的物理列分割的数据集得以组合,从而进行个体分割(单分区)或集体分割(1个或多个分区)。所有在表中定义的列在每个数据集中都能找到,所以表的特性依然得以保持。
举个简单例子:一个包含十年发票记录的表可以被分区为十个不同的分区,每个分区包含的是其中一年的记录。(朋奕注:这里具体使用的分区方式我们后面再说,可以先说一点,一定要通过某个属性列来分割,譬如这里使用的列就是年份)
垂直分区(Vertical Partitioning)
这种分区方式一般来说是通过对表的垂直划分来减少目标表的宽度,使某些特定的列被划分到特定的分区,每个分区都包含了其中的列所对应的行。
举个简单例子:一个包含了大text和BLOB列的表,这些text和BLOB列又不经常被访问,这时候就要把这些不经常使用的text和BLOB了划分到另一个分区,在保证它们数据相关性的同时还能提高访问速度。
在数据库供应商开始在他们的数据库引擎中建立分区(主要是水平分区)时,DBA和建模者必须设计好表的物理分区结构,不要保存冗余的数据(不同表中同时都包含父表中的数据)或相互联结成一个逻辑父对象(通常是视图)。这种做法会使水平分区的大部分功能失效,有时候也会对垂直分区产生影响。
B. 数据库中表分割和表分区的区别是什么
个人认为理论上使用表分割在性能上应该和建立表分区查不多,但是,表分割对于所有的数据库都适用,而表分区只能用于oracle这样的特定的数据库;表分区属于数据库物理设计,表分割属于逻辑设计。
表分区:
表分区是ORACLE对于非常大的表进行优化的一种有效方法, 是非常有效的一种手段, 在很多情况下,比你说的表分割更有效,比如,有一个代码表,使用分区表把100万纪录分在10个分区中(ID 每从1到10万为一个分区),那样写查询语句的时候,只要给出查询条件中所需要的代码,ORACLE自动会定位到对应的分区进行查询,大大降低的查询时间. 而采用表分割,那必须先根据查询的代码指定所要查询的表,才能找到相应的纪录. 而且,如果有下面这样的语句,查询的条件是跨分区的:
SELECT * FROM MYTABLE WHERE ID BETWEEN 99000 AND 10111;
在分区表中是非常容易实现的,ORACLE会自动在两个分区中查询;而采用表分割的话是否必须写成两个查询语句在UNION ALL。
事实上,大型的数据库都有对大表的特殊处理方式(类似于分区表),如果太强调可移植性而放弃这些最重要的特性的话,那性能很可能受到很大的影响.
即便是oracle数据库,当数据量很大时,用分表比用表分区要快些,尤其是在表用到group by求和等操作。
我也认为表分区要好一些,也就是一般说来的分区表,对这些表操作起来有很多强大的功能,说他强大主要是体现在对与表中有海量数据的情况之下的,试问大家一个其中有1亿条记录的表你是否会经常的将其移植到其他数据库系统当中去呢?
表分区基于物理存储,还有就是基于分区的索引可以使用,很不错的,当然,这些都是在海量数据情况之下的比较,但是如果真要是数据量不大的情况下比较,我想要比较分区表和表分割就没什么意思了。
表分区的效果对硬件有所依赖,而且效果恐怕不如诸位想象中那么好。我做过一点测试,很失望。
而表分割的效率提升在很多时候(不是所有时候)是很明显的。
当然这都是在巨型表的前提下讨论,缩小表和索引的规模有利于提高效率,这正是分割表的特点。
表分割:
1、水平分割:根据一列或多列数据的值把数据行放到两个独立的表中。
水平分割通常在下面的情况下使用:A 表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度。B 表中的数据本来就有独立性,例如表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用。C需要把数据存放到多个介质上。
例如法规表law就可以分成两个表active-law和 inactive-law。activea-authors表中的内容是正生效的法规,是经常使用的,而inactive-law表则使已经作废的法规,不常被查询。水平分割会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要union操作。在许多数据库应用中,这种复杂性会超过它带来的优点,因为只要索引关键字不大,则在索引用于查询时,表中增加两到三倍数据量,查询时也就增加读一个索引层的磁盘次数。
2、垂直分割:把主码和一些列放到一个表,然后把主码和另外的列放到另一个表中。
如果一个表中某些列常用,而另外一些列不常用,则可以采用垂直分割,另外垂直分割可以使得数据行变小,一个数据页就能存放更多的数据,在查询时就会减少I/O 次数。其缺点是需要管理冗余列,查询所有数据需要join操作。
C. 数据量达到多少需要表分区 sql
表分区有两个条件:1、数据量大;2、有一定标准的数据读取,比如:按照日期年份分区,那么2013年的数据是历史数据不经常读,这样才行,如果是做数据分析的话,表分区就不太合适,如果经常夸分区读数的话,不但速度不快,反而变慢了
数据量大 还真不太好定 我现在用的表 一个月的数据超过500万 就是大数据了,可能有的公司是一个表超过500万就是大数据了,关键是看服务器的承受力
D. oracle分区表的分区有几种类型
oracle分区表的分区有四种类型:范围分区、散列分区、列表分区和复合分区。
特点如下:
1、范围分区
就是根据数据库表中某一字段的值的范围来划分分区。
数据中有空值,Oracle机制会自动将其规划到maxvalue的分区中。
2、散列分区
根据字段的hash值进行均匀分布,尽可能地实现各分区所散列的数据相等。
散列分区即为哈希分区,Oracle采用哈希码技术分区,具体分区如何由Oracle说的算,也可能我下一次搜索就不是这个数据了。
3、列表分区
列表分区明确指定了根据某字段的某个具体值进行分区,而不是像范围分区那样根据字段的值范围来划分的。
4、复合分区
根据范围分区后,每个分区内的数据再散列地分布在几个表空间中,这样我们就要使用复合分区。复合分区是先使用范围分区,然后在每个分区同再使用散列分区的一种分区方法。
比如将part_date的记录按时间分区,然后每个分区中的数据分三个子分区,将数据散列地存储在三个指定的表空间中。
(4)数据库表分区扩展阅读:
分区的恢复方法:
如果数据库运行在archive 模式下,那么一旦数据库损坏则可以通过冷备份(热备份)和归档备份将数据库恢复到断点状态。
数据库控制文件恢复(假设所有控制文件均被破坏):
数据库基于文件系统: 利用操作系统的tar、cp等命令即可。
数据库基于裸设备:dd if=$ORACLE_BASE/con.bak of=/dev/rdrd/drd1 seek=12
E. oracle数据库如何查看表的表分区的信息(每个表分区的名字和所属表空间)
这样SELECT TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME
FROM USER_TAB_PARTITIONS
注:
USER_TAB_PARTITIONS:可查看分区表的名字、归属表空间以及表的详细分区情况。
USER_PART_TABLES:可查看用户所有的分区表,以及分区方式。
(5)数据库表分区扩展阅读:
分区表的作用
Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。
分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。每个分区有自己的名称,还可以选择自己的存储特性。从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。
但是,从应用程序的角度来看,分区后的表与非分区表完全相同,使用 SQL DML 命令访问分区后的表时,无需任何修改。
F. Oracle数据库查询分区表
查分区表user_tab_partitions,或者user_segments,或者user_objects都行。
个人感觉user_tab_partitions比较好。
至于6个月之前,可以用sysdate和add_months来做,然后再to_char截取,就行
G. 数据库分区表 什么情况下需要分区
数据量很大,而且经常按照某个字段进行条件过滤或者分组时,可以考虑使用分区,例如某种商品的销售情况,经常要查看某个月、某个季度的销售明细或者总计,则可以根据销售日期进行分区,每个月分为一个区,而且最好是能够把不同区的数据分别存放在不同的物理硬盘上,这样在进行查询的时候,如果查询某个月的数据,可以直接在特定硬盘查询,数据量小,速度快,如果查询所有月份的数据,多块硬盘可以并行查询,速度也会明显提高。
H. MySQL 表数据分区,每10000条数据自动分区
Mysql不能自动创建分区,需要使用mysql event事件的方式自动创建分区
1.创建分区的存储过程如下(每次执行先校验当前分区是否存在,如果存在则不处理;不存在则创建):
DELIMITER $$#该表所在数据库名称USE `demo`$$DROP PROCEDURE IF EXISTS `create_partition_by_day`$$CREATE PROCEDURE `create_partition_by_day`(IN_SCHEMANAME VARCHAR(64), IN_TABLENAME VARCHAR(64))BEGIN #当前日期存在的分区的个数 DECLARE ROWS_CNT INT UNSIGNED; #目前日期,为当前日期的后一天 DECLARE TARGET_DATE TIMESTAMP; #分区的名称,格式为p20180620 DECLARE PARTITIONNAME VARCHAR(9); #当前分区名称的分区值上限,即为 PARTITIONNAME + 1 DECLARE PARTITION_ADD_DAY VARCHAR(9); SET TARGET_DATE = NOW() + INTERVAL 1 DAY; SET PARTITIONNAME = DATE_FORMAT( TARGET_DATE, 'p%Y%m%d' ); SET TARGET_DATE = TARGET_DATE + INTERVAL 1 DAY; SET PARTITION_ADD_DAY = DATE_FORMAT( TARGET_DATE, '%Y%m%d' ); SELECT COUNT(*) INTO ROWS_CNT FROM information_schema.partitions WHERE table_schema = IN_SCHEMANAME AND table_name = IN_TABLENAME AND partition_name = PARTITIONNAME; IF ROWS_CNT = 0 THEN SET @SQL = CONCAT( 'ALTER TABLE `', IN_SCHEMANAME, '`.`', IN_TABLENAME, '`', ' ADD PARTITION (PARTITION ', PARTITIONNAME, " VALUES LESS THAN (", PARTITION_ADD_DAY ,") ENGINE = InnoDB);" ); PREPARE STMT FROM @SQL; EXECUTE STMT; DEALLOCATE PREPARE STMT; ELSE SELECT CONCAT("partition `", PARTITIONNAME, "` for table `",IN_SCHEMANAME, ".", IN_TABLENAME, "` already exists") AS result; END IF;END$$DELIMITER ;
2.数据库定时任务(每小时执行一次)
DELIMITER $$#该表所在的数据库名称USE `demo`$$CREATE EVENT IF NOT EXISTS `daily_generate_partition`ON SCHEDULE EVERY 1 hour #执行周期,还有天、月等等STARTS '2018-06-20 00:00:00'ON COMPLETION PRESERVEENABLECOMMENT 'Creating partitions'DO BEGIN #调用刚才创建的存储过程,第一个参数是数据库名称,第二个参数是表名称 CALL datacollectcenter.create_partition_by_day('demo','test1');END$$DELIMITER ;
I. 在my sql中怎么将数据表分区
可以看mysql的data文件夹下面的数据库文件,就可以查看当前分区情况。
还有几种获取MySQL分区表信息的常用方法
SHOW CREATE TABLE
可以查看创建分区表的CREATE语句
SHOW TABLE STATUS
可以查看表是否为分区表
查看INFORMATION_SCHEMA.PARTITIONS表
可以查看表具有哪几个分区、分区的方法、分区中数据的记录数等重要信息
J. 数据库分区和分表的区别
分区、分表、分库的详细理解
一、什么是分区、分表、分库
分区
就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的
分表
就是把一张表按一定的规则分解成N个具有独立存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它。
分库
一旦分表,一个库中的表会越来越多
将整个数据库比作图书馆,一张表就是一本书。当要在一本书中查找某项内容时,如果不分章节,查找的效率将会下降。而同理,在数据库中就是分区。
二、常用的单机数据库的瓶颈
问题描述
单个表数据量越大,读写锁,插入操作重新建立索引效率越低。
单个库数据量太大(一个数据库数据量到就是极限)
单个数据库服务器压力过大
读写速度遇到瓶颈(并发量几百)
三、分区
什么时候考虑使用分区?
一张表的查询速度已经慢到影响使用的时候。
sql经过优化
数据量大
表中的数据是分段的
对数据的操作往往只涉及一部分数据,而不是所有的数据
分区解决的问题
主要可以提升查询效率
分区的实现方式(简单)
mysql5 开始支持分区功能
四、分表
什么时候考虑分表?
一张表的查询速度已经慢到影响使用的时候。
sql经过优化
数据量大
当频繁插入或者联合查询时,速度变慢
分表解决的问题
分表后,单表的并发能力提高了,磁盘I/O性能也提高了,写操作效率提高了
查询一次的时间短了
数据分布在不同的文件,磁盘I/O性能提高
读写锁影响的数据量变小
插入数据库需要重新建立索引的数据减少
分表的实现方式(复杂)
需要业务系统配合迁移升级,工作量较大
分区和分表的区别与联系
分区和分表的目的都是减少数据库的负担,提高表的增删改查效率。
分区只是一张表中的数据的存储位置发生改变,分表是将一张表分成多张表。
当访问量大,且表数据比较大时,两种方式可以互相配合使用。
当访问量不大,但表数据比较多时,可以只进行分区。
常见分区分表的规则策略(类似)
Range(范围)
Hash(哈希)
按照时间拆分
Hash之后按照分表个数取模
在认证库中保存数据库配置,就是建立一个DB,这个DB单独保存user_id到DB的映射关系