MySQL的表分区详解 - 查看分区数据量,查看全库数据量----转http://blog.csdn.net/xj626852095/article/details/51245844
查看分区数据量,查看全库数据量
USE information_schema;
SELECT PARTITION_NAME,TABLE_ROWS
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = 'sale_data';
SELECT table_name,table_rows FROM TABLES
WHERE TABLE_SCHEMA = 'db_name'
ORDER BY table_rows DESC
;
http://my.oschina.net/ydsakyclguozi/blog/393583
一、什么是表分区
通俗地讲表分区是将一大表,根据条件分割成若干个小表。mysql5.1开始支持数据表分区了。
如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区。当然也可根据其他的条件分区。
二、为什么要对表进行分区
为了改善大型表以及具有各种访问模式的表的可伸缩性,可管理性和提高数据库效率。
分区的一些优点包括:
1)、与单个磁盘或文件系统分区相比,可以存储更多的数据。
2)、对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的分区,很容易地删除那些数据。相反地,在某些情况下,添加新数据的过程又可以通过为那些新数据专门增加一个新的分区,来很方便地实现。通常和分区有关的其他优点包括下面列出的这些。MySQL分区中的这些功能目前还没有实现,但是在我们的优先级列表中,具有高的优先级;我们希望在5.1的生产版本中,能包括这些功能。
3)、一些查询可以得到极大的优化,这主要是借助于满足一个给定WHERE语句的数据可以只保存在一个或多个分区内,这样在查找时就不用查找其他剩余的分区。因为分区可以在创建了分区表后进行修改,所以在第一次配置分区方案时还不曾这么做时,可以重新组织数据,来提高那些常用查询的效率。
4)、涉及到例如SUM()和COUNT()这样聚合函数的查询,可以很容易地进行并行处理。这种查询的一个简单例子如 “SELECT
salesperson_id, COUNT (orders) as order_total FROM sales GROUP BY
salesperson_id;”。通过“并行”,这意味着该查询可以在每个分区上同时进行,最终结果只需通过总计所有分区得到的结果。
5)、通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量。
三、分区类型
· RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。
· LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
· HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
· KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。
1.RANGE分区
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR( 30 ), lname VARCHAR( 30 ), hired DATE NOT NULL DEFAULT '1970-01-01' , separated DATE NOT NULL DEFAULT '9999-12-31' , job_code INT NOT NULL, store_id INT NOT NULL ) partition BY RANGE (store_id) ( partition p0 VALUES LESS THAN ( 6 ), partition p1 VALUES LESS THAN ( 11 ), partition p2 VALUES LESS THAN ( 16 ), partition p3 VALUES LESS THAN ( 21 ) ); |
对于包含数据(72, 'Michael', 'Widenius', '1998-06-25', NULL,
13)的一个新行,可以很容易地确定它将插入到p2分区中,但是如果增加了一个编号为第21的商店,将会发生什么呢?在这种方案下,由于没有规则把store_id大于20的商店包含在内,服务器将不知道把该行保存在何处,将会导致错误。
要避免这种错误,可以通过在CREATE TABLE语句中使用一个“catchall” VALUES LESS
THAN子句,该子句提供给所有大于明确指定的最高值的值:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR( 30 ), lname VARCHAR( 30 ), hired DATE NOT NULL DEFAULT '1970-01-01' , separated DATE NOT NULL DEFAULT '9999-12-31' , job_code INT NOT NULL, store_id INT NOT NULL ) PARTITION BY RANGE (store_id) ( PARTITION p0 VALUES LESS THAN ( 6 ), PARTITION p1 VALUES LESS THAN ( 11 ), PARTITION p2 VALUES LESS THAN ( 16 ), PARTITION p3 VALUES LESS THAN MAXVALUE ); |
MAXVALUE
表示最大的可能的整数值。现在,store_id
列值大于或等于16(定义了的最高值)的所有行都将保存在分区p3中。在将来的某个时候,当商店数已经增长到25, 30, 或更多
,可以使用ALTER TABLE语句为商店21-25, 26-30,等等增加新的分区。
在几乎一样的结构中,你还可以基于雇员的工作代码来分割表,也就是说,基于job_code
列值的连续区间。例如——假定2位数字的工作代码用来表示普通(店内的)工人,三个数字代码表示办公室和支持人员,四个数字代码表示管理层,你可以使用下面的语句创建该分区表:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR( 30 ), lname VARCHAR( 30 ), hired DATE NOT NULL DEFAULT '1970-01-01' , separated DATE NOT NULL DEFAULT '9999-12-31' , job_code INT NOT NULL, store_id INT NOT NULL ) PARTITION BY RANGE (job_code) ( PARTITION p0 VALUES LESS THAN ( 100 ), PARTITION p1 VALUES LESS THAN ( 1000 ), PARTITION p2 VALUES LESS THAN ( 10000 ) ); |
在VALUES LESS THAN 子句中使用一个表达式也是可能的。这里最值得注意的限制是MySQL 必须能够计算表达式的返回值作为LESS THAN (<)比较的一部分;因此,表达式的值不能为NULL
。由于这个原因,雇员表的hired, separated, job_code,和store_id列已经被定义为非空(NOT NULL)。
除了可以根据商店编号分割表数据外,你还可以使用一个基于两个DATE (日期)中的一个的表达式来分割表数据。例如,假定你想基于每个雇员离开公司的年份来分割表,也就是说,YEAR(separated)的值。实现这种分区模式的CREATE
TABLE 语句的一个例子如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR( 30 ), lname VARCHAR( 30 ), hired DATE NOT NULL DEFAULT '1970-01-01' , separated DATE NOT NULL DEFAULT '9999-12-31' , job_code INT, store_id INT ) PARTITION BY RANGE (YEAR(separated)) ( PARTITION p0 VALUES LESS THAN ( 1991 ), PARTITION p1 VALUES LESS THAN ( 1996 ), PARTITION p2 VALUES LESS THAN ( 2001 ), PARTITION p3 VALUES LESS THAN MAXVALUE ); |
1)、 当需要删除一个分区上的“旧的”数据时,只删除分区即可。如果你使用上面最近的那个例子给出的分区方案,你只需简单地使用 “ALTER TABLE employees DROP PARTITION
p0;”来删除所有在1991年前就已经停止工作的雇员相对应的所有行。对于有大量行的表,这比运行一个如“DELETE FROM employees WHERE YEAR (separated) <= 1990;”这样的一个DELETE查询要有效得多。
3)、经常运行直接依赖于用于分割表的列的查询。例如,当执行一个如“SELECT COUNT(*) FROM employees WHERE YEAR(separated) = 2000
GROUP BY store_id;”这样的查询时,MySQL可以很迅速地确定只有分区p2需要扫描,这是因为余下的分区不可能包含有符合该WHERE子句的任何记录。
2.LIST分区
LIST分区通过使用“PARTITION BY LIST(expr)”来实现,其中“expr”
是某列值或一个基于某个列值、并返回一个整数值的表达式,然后通过“VALUES IN
(value_list)”的方式来定义每个分区,其中“value_list”是一个通过逗号分隔的整数列表。
注释:在MySQL 5.1中,当使用LIST分区时,有可能只能匹配整数列表。
1
2
3
4
5
6
7
8
9
|
CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR( 30 ), lname VARCHAR( 30 ), hired DATE NOT NULL DEFAULT '1970-01-01' , separated DATE NOT NULL DEFAULT '9999-12-31' , job_code INT, store_id INT ); |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR( 30 ), lname VARCHAR( 30 ), hired DATE NOT NULL DEFAULT '1970-01-01' , separated DATE NOT NULL DEFAULT '9999-12-31' , job_code INT, store_id INT ) PARTITION BY LIST(store_id) PARTITION pNorth VALUES IN ( 3 , 5 , 6 , 9 , 17 ), PARTITION pEast VALUES IN ( 1 , 2 , 10 , 11 , 19 , 20 ), PARTITION pWest VALUES IN ( 4 , 12 , 13 , 14 , 18 ), PARTITION pCentral VALUES IN ( 7 , 8 , 15 , 16 ) ); |
1
|
INSERT INTO employees VALUES( 224 , 'Linus' , 'Torvalds' , '2002-05-01' , '2004-10-12' , 42 , 21 ); |
LIST分区除了能和RANGE分区结合起来生成一个复合的子分区,与HASH和KEY分区结合起来生成复合的子分区也是可能的。
3.HASH分区
要使用HASH分区来分割一个表,要在CREATE TABLE 语句上添加一个“PARTITION BY HASH
(expr)”子句,其中“expr”是一个返回一个整数的表达式。它可以仅仅是字段类型为MySQL
整型的一列的名字。此外,你很可能需要在后面再添加一个“PARTITIONS num”子句,其中num
是一个非负的整数,它表示表将要被分割成分区的数量。
1
2
3
4
5
6
7
8
9
10
11
|
CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR( 30 ), lname VARCHAR( 30 ), hired DATE NOT NULL DEFAULT '1970-01-01' , separated DATE NOT NULL DEFAULT '9999-12-31' , job_code INT, store_id INT ) PARTITION BY HASH(store_id) PARTITIONS 4 ; |
1
2
3
4
5
6
7
8
9
10
11
|
CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR( 30 ), lname VARCHAR( 30 ), hired DATE NOT NULL DEFAULT '1970-01-01' , separated DATE NOT NULL DEFAULT '9999-12-31' , job_code INT, store_id INT ) PARTITION BY LINEAR HASH(YEAR(hired)) PARTITIONS 4 ; |
1
2
3
4
|
V = POWER( 2 , CEILING(LOG( 2 , 7 ))) = 8 N = YEAR( '2003-04-14' ) & ( 8 - 1 ) = 2003 & 7 = 3 |
1
2
3
4
5
6
7
8
|
V = 8 N = YEAR( '1998-10-19' ) & ( 8 - 1 ) = 1998 & 7 = 6 ( 6 >= 4 为真(TRUE): 还需要附加的步骤) N = 6 & CEILING( 5 / 2 ) = 6 & 3 = 2 |
4.KSY分区
1
2
3
4
5
6
7
|
CREATE TABLE tk ( col1 INT NOT NULL, col2 CHAR( 5 ), col3 DATE ) PARTITION BY LINEAR KEY (col1) PARTITIONS 3 ; |
========================
1、建立分区表
CREATE TABLE sale_data (
sale_date DATETIME NOT NULL,
ale_item VARCHAR(2) NOT NULL,
sale_money DECIMAL(10,2) NOT NULL
)
PARTITION BY RANGE ((year(sale_date)*100+month(sale_date))*100+day(sale_date)) (
PARTITION s20100401 VALUES LESS THAN (20100402),
PARTITION s20100402 VALUES LESS THAN (20100403),
PARTITION s20100403 VALUES LESS THAN (20100404),
PARTITION s20100404 VALUES LESS THAN (20100405),
PARTITION s20100405 VALUES LESS THAN (20100406),
PARTITION s20100406 VALUES LESS THAN (20100407),
PARTITION p1 VALUES LESS THAN (MAXVALUE)
);
2、增加分区
PARTITION p1 VALUES LESS THAN (MAXVALUE) 这句要去掉,才可以增加分区
ALTER TABLE sale_data
ADD PARTITION (PARTITION s20100402 VALUES LESS THAN (20100403));
3、删除分区
ALTER TABLE sale_data DROP PARTITION s20100406 ;
4、正常使用
insert into sale_data values('2010-04-01','11',11.11);
insert into sale_data values('2010-04-02','22',22.22);
5、查看数据是否已经分区保存
SELECT PARTITION_NAME,TABLE_ROWS
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = 'sale_data';
+----------------+------------+
| PARTITION_NAME | TABLE_ROWS |
+----------------+------------+
| s20100401 | 1 |
| s20100402 | 1 |
+----------------+------------+
2 rows in set (0.09 sec)
MySQL的表分区详解 - 查看分区数据量,查看全库数据量----转http://blog.csdn.net/xj626852095/article/details/51245844的更多相关文章
- (转)Mysql 多表查询详解
MySQL 多表查询详解 一.前言 二.示例 三.注意事项 一.前言 上篇讲到mysql中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有 ...
- Mysql 多表查询详解
Reference: https://blog.csdn.net/jintao_ma/article/details/51260458 一.前言 二.示例 三.注意事项 一.前言 上篇讲到Mysql ...
- springboot项目--传入参数校验-----SpringBoot开发详解(五)--Controller接收参数以及参数校验----https://blog.csdn.net/qq_31001665/article/details/71075743
https://blog.csdn.net/qq_31001665/article/details/71075743 springboot项目--传入参数校验-----SpringBoot开发详解(五 ...
- 线段树详解 (原理,实现与应用)(转载自:http://blog.csdn.net/zearot/article/details/48299459)
原文地址:http://blog.csdn.net/zearot/article/details/48299459(如有侵权,请联系博主,立即删除.) 线段树详解 By 岩之痕 目录: 一:综述 ...
- 【转】【mysql面试】https://blog.csdn.net/hanfazy/article/details/14520437
公司招聘MySQL DBA,也面试了10个2年MySQL DBA工作经验的朋友,谈谈自己的心得,欢迎大家指点. 1 2年MySQL DBA经验 其中许多有水分,一看到简历自我介绍,说公司项目的时 ...
- myeclipse通过数据表生成jpa或hibernate实体---https://blog.csdn.net/partner4java/article/details/8560289
myeclipse通过数据表生成jpa或hibernate实体-----https://blog.csdn.net/partner4java/article/details/8560289
- Mysql SQL查询今天、昨天、n天内、第n天------https://blog.csdn.net/baidu_27222643/article/details/60467585
Mysql SQL查询今天.昨天.n天内.第n天 https://blog.csdn.net/baidu_27222643/article/details/60467585
- 使用Mybatis进行连表查询、left join---https://blog.csdn.net/jinzhencs/article/details/51980518
使用Mybatis进行连表查询.left join https://blog.csdn.net/jinzhencs/article/details/51980518
- HTTP协议详解--转载http://blog.csdn.net/gueter/article/details/1524447
引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...
随机推荐
- linux 密码破解
(一)Linux 系统密码破解 1.在grub选项菜单按E进入编辑模式 2.编辑kernel那行 /init 1 (或/single) 3.按B重启 4.进入后执行下列命令 root@#passwd ...
- Lucene 工作原理<转>
Lucene是一个高性能的java全文检索工具包,它使用的是倒排文件索引结构.该结构及相应的生成算法如下: 0)设有两篇文章1和2 文章1的内容为:Tom lives in Guangzhou,I l ...
- Android——Intent(意图)
//Intent的属性 Intent in1 = new Intent(); ComponentName componentName = new ComponentName(this,Activity ...
- 已知问题汇总 (2013-11-30) - QQ空间, EXTJS
目前发现两个已知问题暂时无法得到解决: 1. QQ空间问题. 打开页面 http://user.qzone.qq.com/822994792/311, 点击 "xxx人赞" 这个链 ...
- 抹掉Scala的糖衣(14) -- Update Method
欢迎关注我的新博客地址:http://cuipengfei.me/ 在Scala中,名字叫做update的方法是有特殊作用的. 比如: 1 2 3 val scores = new scala.col ...
- CLion 2017 注册码
注册码使用时间2017-2018 CNEKJPQZEX-eyJsaWNlbnNlSWQiOiJDTkVLSlBRWkVYIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNz ...
- 察看下列JSP内容
察看下列JSP内容 <html><body> <% for (int i=0;i<3;i++){ %> out.print(i*2); <% } %&g ...
- php -- 魔术方法 之 对象克隆 : __clone()
产生对象的方法: 1.从类产生对象.new,通过new去堆区开辟一块内存空间 2.从对象产生对象.clone,通过关键字clone,将一个对象完整的复制一份,新开辟一块内存空间,将复制的结果存放到该内 ...
- 小结:双连通分量 & 强连通分量 & 割点 & 割边
概要: 各种dfs时间戳..全是tarjan(或加上他的小伙伴)无限膜拜tarjan orzzzzzzzzz 技巧及注意: 强连通分量是有向图,双连通分量是无向图. 强连通分量找环时的决策和双连通的决 ...
- Socket的三个关联函数
/*lrs_save_param将静态或接收到的缓冲区保存到参数中*/lrs_save_param (char *s_desc, char *buf_desc, char *param_name, i ...