MYSQL分区表功能测试简析

大婷君_3364

大婷君_3364

2018-05-14

983人浏览

原创

bitscn.com
1.查看mysql版本是否支持分区  

 SHOW VARIABLES LIKE '%partition%';  

+-------------------+-------+

| Variable_name     | Value |

+-------------------+-------+

| have_partitioning | YES   |

+-------------------+-------+

如果VALUE 为YES 则支持分区,

 2.测试那种存储引擎支持分区   

INOODB引擎       
mysql> Create table engine1(id int) engine=innodb partition by range(id)(partition po values less than(10));   
Query OK, 0 rows affected (0.01 sec)   
MRG_MYISAM引擎   
mysql> Create table engine2(id int) engine=MRG_MYISAM partition by range(id)(partition po values less than(10));   ERROR 1572 (HY000): Engine cannot be used in partitioned tables   
blackhole引擎  
 mysql> Create table engine3(id int) engine=blackhole partition by range(id)(partition po values less than(10));   Query OK, 0 rows affected (0.01 sec)   
CSV引擎  
 mysql> Create table engine4(id int) engine=csv partition by range(id)(partition po values less than(10));   
ERROR 1572 (HY000): Engine cannot be used in partitioned tables   
Memory引擎       
mysql> Create table engine5(id int) engine=memory partition by range(id)(partition po values less than(10));   
Query OK, 0 rows affected (0.01 sec)  
federated引擎   
mysql> Create table engine6(id int) engine=federated partition by range(id)(partition po values less than(10));   
Query OK, 0 rows affected (0.01 sec)   
archive引擎   
mysql> Create table engine7(id int) engine=archive partition by range(id)(partition po values less than(10));   
Query OK, 0 rows affected (0.01 sec)   
myisam 引擎   
mysql> Create table engine8(id int) engine=myisam partition by range(id)(partition po values less than(10));   
Query OK, 0 rows affected (0.01 sec)

3.Mysql分区表,分区引擎测试   

表分区的存储引擎相同   

mysql> Create table pengine1(id int) engine=myisam partition by range(id)(partition po values less than(10) engine=myisam, partition p1 values less than(20) engine=myisam);   Query OK, 0 rows affected (0.05 sec)

表分区的存储引擎不同

mysql> Create table pengine2(id int) engine=myisam partition by range(id)(partition po values less than(10) engine=myisam, partition p1 values less than(20) engine=innodb);   ERROR 1497 (HY000): The mix of handlers in the partitions is not allowed in this version of MySQL

同一个分区表中的所有分区必须使用同一个存储引擎,并且存储引擎要和主表的保持一致。 

4.分区类型   

Range:基于一个连续区间的列值,把多行分配给分区;   

LIST:列值匹配一个离散集合;   Hash:基于用户定义的表达式的返回值选择分区,表达式对要插入表中的列值进行计算。这个函数可以包含SQL中有效的,产生非负整数值的任何表达式。   

KEY:类似于HASH分区,区别在于KEY 分区的表达式可以是一列或多列,且MYSQL提供自身的HASH函数。

5.RANGE分区MAXVALUE值 及加分区测试;

创建表 PRANGE,最后分区一个分区值是MAXVALUE

mysql> Create table prange(id int) engine=myisam partition by range(id)(partition po values less than(10), partition p1 values less than(20),partition p2 values less than maxvalue);Query OK, 0 rows affected (0.06 sec)

加分区 

mysql> alter table prange add partition (partition p3 values less than (20));ERROR 1481 (HY000): MAXVALUE can only be used in last partition definition

在分区P0前面加个分区

mysql> alter table prange add partition (partition p3 values less than (1));ERROR 1481 (HY000): MAXVALUE can only be used in last partition definition

说明有MAXVALUE值后,直接加分区是不可行的;

 创建表PRANGE1,无MAXVALUE值

js-实现炫酷在线答题测试特效
js-实现炫酷在线答题测试特效

炫酷在线答题测试js特效代码

下载
mysql> Create table prange1(id int) engine=myisam partition by range(id)(partition po values less than(10), partition p1 values less than(20),partition p2 values less than (30));    Query OK, 0 rows affected (0.08 sec)

从最大值后加个分区

mysql> alter table prange1 add partition (partition p3 values less than (40));Query OK, 0 rows affected (0.02 sec)Records: 0 Duplicates: 0 Warnings: 0

从分区的最小值前加个分区

mysql> alter table prange1 add partition (partition p43 values less than (1));ERROR 1493 (HY000): VALUES LESS THAN value must be strictly increasing for each partition

由此可见,RANGE 的分区方式在加分区的时候,只能从最大值后面加,而最大值前面不可以添加;
6. 用时间做分区测试    

create table ptime2(id int,createdate datetime) engine=myisam partition by range (to_days(createdate))    
(partition po values less than (20100801),partition p1 values less than (20100901));       
Query OK, 0 rows affected (0.01 sec)  
mysql> create table ptime3(id int,createdate datetime) engine=myisam partition by range (createdate)   
(partition po values less than (20100801),partition p1 values less than (20100901));    
ERROR 1491 (HY000): The PARTITION function returns the wrong type

直接使用时间列不可以,RANGE分区函数返回的列需要是整型。       

mysql> create table ptime6(id int,createdate datetime) engine=myisam partition by range (year(createdate)) 
(partition po values less than (2010),partition p1 values less than (2011));    
Query OK, 0 rows affected (0.01 sec)

 使用年函数也可以分区。

7.Mysql可用的分区函数  

DAY()
DAYOFMONTH()
DAYOFWEEK()
DAYOFYEAR()
DATEDIFF()
EXTRACT()
HOUR()
MICROSECOND()
MINUTE()
MOD()
MONTH()
QUARTER()
SECOND()
TIME_TO_SEC()
TO_DAYS()
WEEKDAY()
YEAR()
YEARWEEK() 等

当然,还有FLOOR(),CEILING() 等,前提是使用这两个分区函数的分区健必须是整型。

要小心使用其中的一些函数,避免犯逻辑性的错误,引起全表扫描。

比如:

create table ptime11(id int,createdate datetime) engine=myisam partition by range (day(createdate)) (partition po values less than (15),partition p1 values less than (31));
mysql> insert into ptime11 values (1,'2010-06-17');
mysql> explain partitions select count(1) from ptime11 where createdate>'2010-08-17'/G;
*************************** 1. row ***************************           
id: 1
select_type: SIMPLE        
table: ptime11   
partitions: po,p1         
type: ALLpossible_keys: NULL          
key: NULL      
key_len: NULL         
ref: NULL         
rows: 5        
Extra: Using where
1 row in set (0.00 sec)

8.主键及约束测试   

分区健不包含在主键内   

mysql> create table pprimary(id int,createdate datetime,primary key(id)) engine=myisam partition by range (day(createdate)) (partition po values less than (15),partition p1 values less than (31));    
ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function

分区健包含在主键内

mysql> create table pprimary1(id int,createdate datetime,primary key(id,createdate)) engine=myisam partition by range (day(createdate)) (partition po values less than (15),partition p1 values less than (31));Query OK, 0 rows affected (0.05 sec)

说明分区健必须包含在主键里面。 

mysql> create table pprimary2(id int,createdate datetime,uid char(10),primary key(id,createdate),unique key(uid)) engine=myisam partition by range(to_days(createdate))(partition p0 values less than (20100801),partition p1 values less than (20100901));ERROR 1503 (HY000): A UNIQUE INDEX must include all columns in the table's partitioning function

说明在表上建约束索引会有问题,必须把约束索引列包含在分区健内。

 mysql> create table pprimary3(id int,createdate datetime,uid char(10),primary key(id,createdate),unique key(createdate)) engine=myisam partition by range(to_days(createdate))(partition p0 values less than (20100801),partition p1 values less than (20100901));Query OK, 0 rows affected (0.00 sec)

虽然在表上可以加约束索引,但是只有包含在分区健内,这种情况在实际应用过程中会遇到问题,这个问题点在以后的MYSQL 版本中也许会改进。
9.子分区测试

只有RANGE和LIST分区才能有子分区,每个分区的子分区数量必须相同,

mysql> create table pprimary7(id int,createdate datetime,uid char(10),primary key(id,createdate)) engine=myisam partition by range(to_days(createdate)) subpartition by hash(to_days(createdate))(partition p0 values less than (20100801) ( subpartition so,subpartition s1) ,partition p1 values less than (20100901) (subpartition s0,subpartition s1));    
ERROR 1517 (HY000): Duplicate partition name s1

提示了重复的分区名称错误,这和MYSQL5.1帮助文档中的说明有出入,不知道是不是这个问题在某个小版本中修改过。
10.MYSQL分区健NULL值测试;    

MYSQL将NULL值视为0.自动插入最小的分区中。

11.MYSQL分区管理测试

mysql> alter table pprimary4 truncate partition p1;ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'truncate partition p1' at line 1

5.1版本中还不支持这个语法,5.5中已经支持,很好的一个命令;

ALTER TABLE reorganize 可以重新组织分区。  

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4643

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

951

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1209

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6621

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3363

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6600

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

9081

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1230

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1072

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程