`
xuzhfa123
  • 浏览: 116725 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

MySQL分区表测试

阅读更多
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 可以重新组织分区。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/alex_198208/archive/2010/09/03/5862039.aspx
分享到:
评论

相关推荐

    MYSQL分区表测试

    MYSQL分区表测试过程详细说明。MYSQL分区表测试过程详细说明。

    MySQL 5.5.8 分区表性能测试

    测试结果 博文链接:https://hawthorstein.iteye.com/blog/888755

    创建mysql表分区的方法

    表分区的测试使用,主要内容来自于其他博客文章以及mysql5.1的参考手册mysql测试版本:mysql5.5.28mysql物理存储文件(有mysql配置的datadir决定存储路径)格式简介数据库engine为MYISAMfrm表结构文件,myd表数据...

    MySql数据分区操作之新增分区操作

    如果想在已经建好的表上进行分区,如果使用alter添加分区的话,mysql会提示错误: ...测试创建分区表文件 代码如下: CREATE TABLE tr (id INT, name VARCHAR(50), purchased DATE) PARTITION BY RANGE(YEAR(purcha

    MySQL分区表的局限和限制详解

    本文对Mysql分区表的局限性做了一些总结,因为个人能力以及测试环境的 原因,有可能有错误的地方,还请大家看到能及时指出,当然有兴趣的朋友可以去官方网站查阅。

    MYSQL学习资料

    MySQL水平分区表实际操作总结 Mysql水平分表 mysql水平分表和垂直分表和数据库分区 sysbench mysql 坚持不懈 sysbench安装和使用 SHOW INNODB STATUS 探秘 体验Innodb with Memcached –安装 数据切分及整合方案 ...

    MySQL使用的测试样例数据库,Employees Sample Database,datacharmer/test-db

    Employees 数据库提供了6张表,总共有400万条数据记录(其中30万条员工记录、280万条工资记录),导出数据大约160MB,该数据库兼容多种存储引擎,支持分区表。 另外除了基本数据外,Employees数据库还包括一套测试,...

    高性能MySQL(第3版).part2

    7.1.3如何使用分区表262 7.1.4什么情况下会出问题263 7.1.5查询优化266 7.1.6合并表267 7.2视图270 7.2.1可更新视图272 7.2.2视图对性能的影响273 7.2.3视图的限制274 7.3外键约束275 7.4在MySQL内部存储...

    MySQL 5.1中文手冊

    5.4. mysql_fix_privilege_tables:升级MySQL系统表 5.5. MySQL服务器关机进程 5.6. 一般安全问题 5.6.1. 通用安全指南 5.6.2. 使MySQL在攻击者面前保持安全 5.6.3. Mysqld安全相关启动选项 5.6.4. LOAD DATA LOCAL...

    MySQL 5.1官方简体中文参考手册

    5.4. mysql_fix_privilege_tables:升级MySQL系统表 5.5. MySQL服务器关机进程 5.6. 一般安全问题 5.6.1. 通用安全指南 5.6.2. 使MySQL在攻击者面前保持安全 5.6.3. Mysqld安全相关启动选项 5.6.4. LOAD DATA LOCAL...

    MySQL高性能优化规范建议

    5. 谨慎使用 MySQL 分区表 6.尽量做到冷热数据分离,减小表的宽度 7. 禁止在表中建立预留字段 8. 禁止在数据库中存储图片,文件等大的二进制数据 9. 禁止在线上做数据库压力测试 10. 禁止从开发环境,测试环境直接连接...

    MySQL 5.1参考手册

    5.4. mysql_fix_privilege_tables:升级MySQL系统表 5.5. MySQL服务器关机进程 5.6. 一般安全问题 5.6.1. 通用安全指南 5.6.2. 使MySQL在攻击者面前保持安全 5.6.3. Mysqld安全相关启动选项 5.6.4. LOAD DATA LOCAL...

    mysql5.1中文手册

    mysql_fix_privilege_tables:升级MySQL系统表 5.5. MySQL服务器关机进程 5.6. 一般安全问题 5.6.1. 通用安全指南 5.6.2. 使MySQL在攻击者面前保持安全 5.6.3. Mysqld安全相关启动选项 5.6.4. ...

    MySQL 5.1参考手册中文版

    5.4. mysql_fix_privilege_tables:升级MySQL系统表 5.5. MySQL服务器关机进程 5.6. 一般安全问题 5.6.1. 通用安全指南 5.6.2. 使MySQL在攻击者面前保持安全 5.6.3. Mysqld安全相关启动选项 5.6.4. LOAD DATA ...

    MySQL 5.1参考手册 (中文版)

    5.4. mysql_fix_privilege_tables:升级MySQL系统表 5.5. MySQL服务器关机进程 5.6. 一般安全问题 5.6.1. 通用安全指南 5.6.2. 使MySQL在攻击者面前保持安全 5.6.3. Mysqld安全相关启动选项 5.6.4. LOAD DATA LOCAL...

    mysql快速比对库结构差异工具-java版

    1. 两个 MYSQL 数据库对象结构比对工具 (比如:本地测试库、远程运维库表结构、表中列等对比) 2. 比对结果导出EXCEL 存放于 “工程根目录”/export/ 目录下 3. 比对的对象包括 表、表列、表索引、表分区差异、...

    MYSQL中文手册

    5.4. mysql_fix_privilege_tables:升级MySQL系统表 5.5. MySQL服务器关机进程 5.6. 一般安全问题 5.6.1. 通用安全指南 5.6.2. 使MySQL在攻击者面前保持安全 5.6.3. Mysqld安全相关启动选项 5.6.4. LOAD DATA ...

Global site tag (gtag.js) - Google Analytics