`
jiaguwen123
  • 浏览: 415230 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

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 可以重新组织分区。
分享到:
评论

相关推荐

    MySQL 5.5.8 分区表性能测试

    压缩包中的“count.xls”文件可能是测试结果的记录,可能包含了在不同场景下对MySQL 5.5.8分区表性能的具体测试数据,例如查询时间、CPU使用率、内存消耗等指标。通过分析这些数据,我们可以深入了解分区表在实际...

    Mysql分区表的管理与维护

    MySQL分区表是一种优化大型数据库性能的技术,它将一个大表分成多个较小的部分,每个部分称为一个分区,从而提高查询效率和管理能力。分区通常应用于处理大量数据的表,特别是那些有明确范围或时间属性的数据,如...

    mysql 测试数据集,单表200万条数据

    - 分区:对于大数据量的表,可采用分区技术,将数据分散到多个物理存储上,加快查询速度。 - 编码:选择合适的字符编码,如UTF-8或UTF-8MB4,平衡存储空间和字符支持。 4. SQL语句: - SELECT查询:学习如何编写...

    MySQL官方测试数据库

    使用MySQL官方测试数据库,你可以实践如何创建、修改和查询数据库中的表,这包括使用`CREATE TABLE`语句来定义表结构,`ALTER TABLE`来修改表结构,以及`SELECT`来检索数据。 数据库通常由多个表组成,每个表都有...

    mysql分区.pdf

    MySQL分区是数据库管理系统MySQL中的一种数据存储管理技术,它允许用户将数据表拆分成多个较小的、更容易管理的片段。这些片段被称为分区。通过这种技术可以提高数据库的性能,便于维护和备份,并且可以对不同分区...

    mysql三百万测试数据.zip

    "mysql三百万测试数据.zip" 提供了三百万条测试数据,这使得我们可以模拟大规模数据库环境,对查询效率、索引策略、内存管理、存储引擎等多方面进行深入测试和调优。 1. **性能测试**: 这些测试数据可以帮助我们...

    mysql 百万级数据测试

    综上所述,"MySQL 百万级数据测试"涵盖了数据库导入、备份恢复、数据建模、索引优化、关系处理、自动化测试以及分区策略等多个方面。这些都是在处理大量数据时必须考虑的关键因素,以确保数据库系统能高效、稳定地...

    MySQL_tpch测试工具简要手册

    MySQL TPCH测试工具简要手册主要关注的是在MySQL数据库系统中使用TPC-H基准测试工具进行性能评估和优化。TPC-H是Transaction Processing Performance Council(事务处理性能委员会)设计的一个标准基准测试,用于...

    Oracle的表结构转成Mysql的表结构

    ### Oracle的表结构转成MySQL的表结构 #### 功能概述 本文介绍了一种将Oracle数据库中的表结构转换为MySQL数据库表结构的方法。通过编写一个PL/SQL函数`fnc_table_to_mysql`来实现这一目标。该函数可以接受四个参数...

    MySQL优化之分区表

    总的来说,MySQL的分区表是一种强大的工具,能够有效应对大数据量的挑战,提高查询性能和系统整体效率。然而,正确使用分区需要对数据分布、查询模式有深入理解,并且在设计阶段就考虑到分区策略,以避免后期维护的...

    mysql测试数据(test_db-master)

    2. **性能测试**:通过大量数据,可以评估不同查询优化策略对MySQL服务器性能的影响,测试索引、分区等技术。 3. **应用集成**:对于开发应用程序,尤其是Web应用,可以测试数据的导入导出、备份恢复以及与前端展示...

    百万mysql测试数据

    2. **表结构设计**:合理设计数据库表结构,包括选择合适的字段类型(如INT、VARCHAR、DATE等)、设置索引(主键、唯一索引、全文索引等)以及决定是否采用分区表等。 3. **性能优化**:关注SQL查询性能,使用...

    Mysql的表对象Sql语句转换单表,转换成Oracle创建表sql

    9. **优化与调整**:转换后的Oracle表可能需要根据Oracle的最佳实践进行一些调整,如分区策略、索引优化等。 总的来说,这个过程涉及到数据库设计、SQL语法理解和自动化脚本编写。对于大型或复杂的数据库迁移,可能...

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

    首先,尝试直接通过`ALTER TABLE`语句添加分区到非分区表会导致错误,MySQL会返回`ERROR 1505 <HY000>: Partition management on a not partitioned table is not possible`。正确的方法是创建一个新的具有相同结构...

    MySQL分区字段列有必要再单独建索引吗?

    在MySQL数据库中,分区是一种优化查询性能的技术,它将大表的数据分成多个逻辑部分,每个部分对应表的一个或多个分区。通常,分区字段是主键的一部分,以确保数据分布均匀并提高查询效率。然而,问题在于,如果一个...

    MySQL官网测试数据上百万条数据sql文件

    7. **性能优化**:在导入大量数据后,可能需要对数据库进行一些性能优化,比如调整查询缓存、分区表、物化视图等。 通过这个压缩包,用户可以学习到如何处理大规模数据导入,理解SQL脚本的编写和执行,以及如何在...

    基于Mysql的表转HBase小Demo

    例如,可以使用批处理工具如Hadoop MapReduce进行大数据量的迁移,或者通过设置合理的HBase表分区策略来提高写入性能。 总之,“基于Mysql的表转HBase小Demo”是一个很好的学习资源,它演示了如何在Java环境中实现...

    zabbix_mysql分区1

    总的来说,Zabbix的MySQL分区优化是一个涉及数据库设计和管理的重要环节。通过合理地利用分区技术,可以有效应对大规模监控数据的挑战,保持Zabbix系统的高效运行。不过,务必根据你的实际情况进行调整,并考虑其他...

Global site tag (gtag.js) - Google Analytics