MYSQL 分区表功能测试。

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值

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: ALL

possible_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 可以重新组织分区。

mysql 获取分区的最大值_MySQL分区表测试相关推荐

  1. mysql表分区数量限制_MySQL分区表的局限和限制详解

    禁止构建 分区表达式不支持以下几种构建: 存储过程,存储函数,UDFS或者插件 声明变量或者用户变量 可以参考分区不支持的SQL函数 算术和逻辑运算符 分区表达式支持+,-,*算术运算,但是不支持DI ...

  2. mysql表分区占用存储_MySQL 分区分表应用场景分析和分区中可能遇到的坑点

    MySQL的分区和分表应用场景分析 在日常工作中当我们的某张表的数据量过大的时候,首当其冲的可能就是进行分区和分表,但是是如何分区或者分表都要结合一点的业务场景下进行分析,才会显著的提升性能,来聊一聊 ...

  3. MYSQL二级表的管理_MySQL分区表的管理~2

    一.维护分区 对于表的维护,我们一般有如下几种方式: CHECK TABLE, OPTIMIZE TABLE, ANALYZE TABLE和REPAIR TABLE. 而这几种方式,对于分区同样适用. ...

  4. mysql创建分区是否存在_mysql中如何判断是否支持分区

    mysql可以通过下面语句判断是否支持分区: SHOW VARIABLES LIKE '%partition%'; 如果输出: have_partitioning   YES 表示支持分区. 或者通过 ...

  5. mysql子分区多少层_MYSQL子分区修剪

    我有一个MYSQL表与分区的年份和子分区的月份.MYSQL子分区修剪 CREATE TABLE ptable ( id INT NOT NULL AUTO_INCREMENT, name varcha ...

  6. mysql获取每年的最后一天_MYSQL中取当前年份的第一天和当前周,月,季度的第一天/最后一天_MySQL...

    bitsCN.com MYSQL中取当前年份的第一天和当前周,月,季度的第一天/最后一天 mysql 获取当年第一天的年月日格式:SELECT DATE_SUB(CURDATE(),INTERVAL ...

  7. mysql 获取最大的平均数_mysql怎么求最大值、最小值和平均值?

    在mysql中,可以分别使用MAX()函数.MIN()函数和AVG()函数来求最大值.最小值和平均值.MAX()和MIN()函数可以返回指定列中的最大值和最小值:AVG()函数通过计算返回的行数和每一 ...

  8. mysql 获取每天的日期_mysql中获取一天、一周、一月时间数据的各种sql语句写法...

    今天抽时间整理了一篇mysql中与天.周.月有关的时间数据的sql语句的各种写法,部分是收集资料,全部手工整理,自己学习的同时,分享给大家,并首先默认创建一个表.插入2条数据,便于部分数据的测试,其中 ...

  9. mysql获取一列数据_mysql返回最后一列数据

    获取MySQL的表中每个userid最后一条记录的方法,并且针对userid不唯一的情况,需要的朋友可以参考下 表结构 CREATE TABLE `t1` ( `userid` int(11) DEF ...

最新文章

  1. Python | 安装Jupyter Notebook及其目录的更改 jupyter问题
  2. Spring IOC和MVC基础知识
  3. linux安装jdk8_Skywalking系列博客1-安装单机版 Skywalking
  4. latex 常用小结
  5. centos安装vsftp后的虚拟用户设置
  6. javabean与json转换(fastjson与jackson两个版本)
  7. [1] SDK Tools安装
  8. 【java笔记】IO流(1):IO流概述,字节输出/输入流读写文件
  9. Tomcat开发技术之与HTTP服务器的集成
  10. 个人主页博客网页设计制作HTML5+CSS大作业——清新春暖花开个人博客网站(6页)
  11. ADNI数据集相关概念整理
  12. 基于CC2430的Zigbee开发套件【转】
  13. cocos2d--仿真树叶飘落效果的实现(精灵旋转、翻转、钟摆运动等综合运用)
  14. SolidWorks to URDF转换及常见机器人模型
  15. NCB:神经元线粒体应激记忆可通过mtDNA水平升高跨代遗传
  16. 蓝天格锐生命环的使用方法
  17. 单链表排序之直接插入排序
  18. vue+node.js+mysql的数据库课程设计有感
  19. iQunix F60机械键盘使用评价(精准踩雷)
  20. OpenStack Nova hacking和读书笔记

热门文章

  1. Ubuntu22.04+Nvidia RTX 3060 显卡驱动安装
  2. python学习笔记,python中的队列及代码实现
  3. capslock亮灯是小写_键盘上的CapsLock灯亮表示是()。
  4. 前端开发之js栈内存和堆内存的区别
  5. java android消息推送_Android中使用socket通信实现消息推送的方法详解
  6. js模块化html,js模块化框架
  7. kafka简介及应用场景、架构
  8. ROS代码经验系列-- tf进行位置查询变换
  9. 公务员考试知识点总结_言语
  10. javascript 语法