zoukankan      html  css  js  c++  java
  • mysql分区表

    分区的作用:

    通常是将一个大表按照某种方式(比如时间上的月份)分成多个较小的,更容易管理的部分

    分区表的对字段的限制

    分区的字段,必须是表上所有的唯一索引(或者主键索引)包含的字段的子集

    下面是网上一个分区表的例子

    #range分区,分区字段必须是整型或者转换为整型
    #创建一个分区表,按照时间的月份进行区分
    CREATE TABLE test_range_partition( id INT auto_increment, createdate DATETIME, primary key (id,createdate) ) PARTITION BY RANGE (TO_DAYS(createdate) ) ( PARTITION p201801 VALUES LESS THAN ( TO_DAYS(
    '20180201') ), PARTITION p201802 VALUES LESS THAN ( TO_DAYS('20180301') ), PARTITION p201803 VALUES LESS THAN ( TO_DAYS('20180401') ), PARTITION p201804 VALUES LESS THAN ( TO_DAYS('20180501') ), PARTITION p201805 VALUES LESS THAN ( TO_DAYS('20180601') ), PARTITION p201806 VALUES LESS THAN ( TO_DAYS('20180701') ), PARTITION p201807 VALUES LESS THAN ( TO_DAYS('20180801') ), PARTITION p201808 VALUES LESS THAN ( TO_DAYS('20180901') ), PARTITION p201809 VALUES LESS THAN ( TO_DAYS('20181001') ), PARTITION p201810 VALUES LESS THAN ( TO_DAYS('20181101') ), PARTITION p201811 VALUES LESS THAN ( TO_DAYS('20181201') ), PARTITION p201812 VALUES LESS THAN ( TO_DAYS('20190101') ) );
    #插入数据 insert into test_range_partition (createdate) values (
    '20180105'); insert into test_range_partition (createdate) values ('20180205'); insert into test_range_partition (createdate) values ('20180206'); insert into test_range_partition (createdate) values ('20180305'); insert into test_range_partition (createdate) values ('20180405'); insert into test_range_partition (createdate) values ('20180505'); insert into test_range_partition (createdate) values ('20180605'); insert into test_range_partition (createdate) values ('20180705'); insert into test_range_partition (createdate) values ('20180805'); insert into test_range_partition (createdate) values ('20180905'); insert into test_range_partition (createdate) values ('20181005'); insert into test_range_partition (createdate) values ('20181105'); #查询各分区表的情况 select table_schema, table_name, partition_name, partition_ordinal_position, partition_method, partition_expression, table_rows from information_schema.`PARTITIONS` where table_schema = 'dstdata' and table_name = 'test_range_partition'; #dstdata是数据库名

    +--------------+----------------------+----------------+----------------------------+------------------+----------------------+------------+
    | table_schema | table_name | partition_name | partition_ordinal_position | partition_method | partition_expression | table_rows |
    +--------------+----------------------+----------------+----------------------------+------------------+----------------------+------------+
    | dstdata | test_range_partition | p201801 | 1 | RANGE | TO_DAYS(createdate) | 1 |
    | dstdata | test_range_partition | p201802 | 2 | RANGE | TO_DAYS(createdate) | 2 | 
    | dstdata | test_range_partition | p201803 | 3 | RANGE | TO_DAYS(createdate) | 1 |
    | dstdata | test_range_partition | p201804 | 4 | RANGE | TO_DAYS(createdate) | 1 |
    | dstdata | test_range_partition | p201805 | 5 | RANGE | TO_DAYS(createdate) | 1 |
    | dstdata | test_range_partition | p201806 | 6 | RANGE | TO_DAYS(createdate) | 1 |
    | dstdata | test_range_partition | p201807 | 7 | RANGE | TO_DAYS(createdate) | 1 |
    | dstdata | test_range_partition | p201808 | 8 | RANGE | TO_DAYS(createdate) | 1 |
    | dstdata | test_range_partition | p201809 | 9 | RANGE | TO_DAYS(createdate) | 1 |
    | dstdata | test_range_partition | p201810 | 10 | RANGE | TO_DAYS(createdate) | 1 |
    | dstdata | test_range_partition | p201811 | 11 | RANGE | TO_DAYS(createdate) | 1 |
    | dstdata | test_range_partition | p201812 | 12 | RANGE | TO_DAYS(createdate) | 0 |
    +--------------+----------------------+----------------+----------------------------+------------------+----------------------+------------+
    12 rows in set (0.00 sec)

    #查询某个分区的数据

    mysql> select * from test_range_partition partition(p201801);
    +----+---------------------+
    | id | createdate |
    +----+---------------------+
    | 1 | 2018-01-05 00:00:00 |
    +----+---------------------+
    1 row in set (0.00 sec)

    mysql> select * from test_range_partition partition(p201802);
    +----+---------------------+
    | id | createdate |
    +----+---------------------+
    | 2 | 2018-02-05 00:00:00 |
    | 3 | 2018-02-06 00:00:00 |
    +----+---------------------+
    2 rows in set (0.00 sec)

     增加一个分区:

    ALTER TABLE test_range_partition ADD PARTITION (PARTITION p201902 VALUES LESS THAN ( TO_DAYS('20190301') ));

    删除一个分区,这里注意:删除一个分区,这个分区里面的数据也会跟着删除

    ALTER TABLE test DROP PARTITION p201902;

     其他类型的分区:

    List分区,分区字段必须是整型或者转换为整型
    按照某个字段上的规则,不同的数据离散地分布在不同的区中。

    create table test_list_partiotion
    (
        id int auto_increment,
        data_type tinyint,
        primary key(id,data_type)
    )partition by list(data_type)
    (
        partition p0 values in (0,1,2,3,4,5,6),
        partition p1 values in (7,8,9,10,11,12),
        partition p2 values in (13,14,15,16,17)
    );

    Hash分区,分区字段必须是整型或者转换为整型
    Hash分区可以将数据均匀地分布到预先定义的分区中,使得各个分区的数据量分布基本上一致。同样,分区字段必须是整型或者转换为整型

    drop table test_hash_partiotion;
    create table test_hash_partiotion
    (
        id int auto_increment,
        create_date datetime,
        primary key(id,create_date)
    )partition by hash(year(create_date)) partitions 10;

    Hash分区缺点:如果分区字段本身的分布不匀均,那么hash分区之后存储的分区也是不均匀的,hash分区时对于hash的字段,需要慎重

            hash分区在查询优化方面,无法优化范围查询,因为无法确定一个某个字段经过hash计算之后究竟分布了在哪个分区之中

    Key分区,分区字段必须是整型或者转换为整型
    与hash分区不用的是,key分区使用MySQL自定义的库函数进行分区,不需要hash分区那样对字段整型进行转换,同样,分区字段必须是整型或者转换为整型

    create table test_key_partiotion
    (
        id int auto_increment,
        create_date datetime,
        primary key(id,create_date)
    )partition by key(create_date) partitions 10;

    column 分区
    解决了分区字段必须是整型或者必须转换为整型的限制,可以对整型,date或者datetime进行支持。

    create table test_column_partiotion
    (
        id int auto_increment,
        data_type datetime,
        primary key(id,data_type)
    )partition by range columns(data_type) (
        partition p0 values less than ('20180101'),
        partition p1 values less than ('20180201'),
        partition p2 values less than ('20180301'),
        partition p3 values less than ('20180401'),
        partition p4 values less than ('20180501'),
        partition p5 values less than ('20180601'),
        partition p6 values less than ('20180701'),
        partition p7 values less than ('20180801')
    );
  • 相关阅读:
    PHP加速器eAccelerator安装
    WCF
    WCF
    WCF
    前端学习书籍推荐
    问题集录01--java对list列表进行排序
    基础知识:字符编码
    基础知识:if条件、while循环、for循环 相关练习
    基础知识:语言、编程、计算机组成、cpu、存储器
    视图 索引 存储过程
  • 原文地址:https://www.cnblogs.com/mmyy-blog/p/11413807.html
Copyright © 2011-2022 走看看