码迷,mamicode.com
首页 > 数据库 > 详细

mysql分区

时间:2015-03-03 20:40:37      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:


    一、为什么要分区?


    需求:大数据。解决方案:分而治之,更细一点即为。将大表和大索引分为一个更小的操作单元

    mysql中,分区允许将表、索引和索引编排表细分为更小的单元。分区后,每个分区有自己单独的名称。对于DBA来讲,这些分区可以统一管理,也可以分开管理。

    但是对于应用程序来讲,分区的表和没有分区的表示一样的。换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理。


    Mysql分区 ,这个是mysql对于分区的官方解释。

     

    1.分区的作用


    a)提升性能

     

    应该说,几乎所有分区的目的都是用来提升性能的。不是谁哪天早上吃着鸡蛋灌饼,说咱们分个区玩玩吧!不是的。那么分区是如何来提升检索数据的性能的呢?没有分区之前,数据每次在查询和检索总是面向的是整个数据库和表。分区之后,mysql针对每个分区生成特定的数据文件与索引文件。每次只会检索特定的部分数据,因此可以更好的来执行和维护数据库。究其原因还是因为在分区之后表指派到不同的物理驱动器上,这样便可在同时访问多个分区时减少物理 I/O 争用。


    b)易于管理


     对于一些无用的冗余的历史数据来讲,可以根据分区之后直接删除相应的分区。操作起来更加简便,因为执行数以万计的数据远比直接删除文件来的困难的多、时间也更加的长。


    c)容错


           分区之后相比分区之前,一张表从之前一个文件分为现在的三个文件。分区之后即使一个文件出现破坏,也不会影响其他数据。

    2..常用分区方法

    1. RANGE分区
    2. LIST分区
    3. HASH分区
    4. KEY分区

    二、如何分区?

    1.查看数据库是否支持分区

    SHOW VARIABLES LIKE '%partition%';

     

      

    技术分享

     

     

    对于mysql来讲,现阶段支持分区操作的版本有5.15.5.如图显示为YES则表明该数据库支持分区操作。

     

    2.四种常见分区

     


    Range分区

    俗称:范围分区。根据表的字段的值,依据给定某段连续的区间来分区。

     

    直接创建表时分区

     

    create table teacher
    (id varchar(20) not null ,
    name varchar(20),
    age varchar(20),
    birthdate date not null,
    salary int
    )
    partition by range(year(birthdate))
    (
    partition p1 values less than (1970),
    partition p2 values less than (1990),
    partition p3 values less than maxvalue
    );
    


     

      Ps:创建teacher表,并在创建teacher表同时根据birthdate 字段将表划分为p1p2p3三个分区。

     

     

    在创建表后分区

     

    ALTER TABLE teacher 
    partition by range(year(birthdate))
    (
    partition p1 values less than (1970),
    partition p2 values less than (1990),
    partition p3 values less than maxvalue
    );
    

     Ps:给已经创建了的表分区,分为p1p2p3.

     

    LIST分区


    俗名:列表分区。其实list分区和range分区应该说都是一样的,不同的是range分区在分区是的依据是一段连续的区间;而list分区针对的分区依据是一组分布的散列值。


    create table student
     (id varchar(20) not null ,
     studentno int(20) not null,
     name varchar(20),
     age varchar(20)
     )
     partition by list(studentno)
     (
     partition p1 values in (1,2,3,4),
     partition p2 values in  (5,6,7,8),
     partition p3 values in (9,10,11)
     );
    


    Ps:如上创建表student,并将student表分为p1p2p3三个分区。需要注意的是一般情况下,针对表的分区字段为int等数值类型。

     

    HASH分区


     

    小名:哈希分区。哈希分区主要是依据表的某个字段以及指定分区的数量。


    create table user (
      id int(20) not null,
      role varchar(20) not null,
      description varchar(50) 
    )
    partition by hash(id) 
    partitions 10;
    

     

    Ps:如上创建user表,并将user表平均分为十个分区。比较有限制的就是需要知道表的数据有多少才能更好平均分配分区。

     

     

    key分区



       类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。


     

    create table role( id int(20) not null,name varchar(20) not null)
    partition by linear key(id)
    partitions 10;
    

     

      

    3.分区表管理


    对指定表添加分区


    alter table user add partition(partition p4 values less than MAXVALUE);  


    删除指定表指定分区


     alter table student drop partition p1;


    创建子分区


    create table role_subp(id int(20) not null,name int(20) not null)
    partition by list(id)
    subpartition by hash(name)
    subpartitions 3
    (
      partition p1 values in(10),
      partition p2 values in(20)
    )
    

     

    复合分区

     

    alter table user
    reorganize partition p1,p3 into
    (partition p1 values less than (1000));
    


mysql分区

标签:

原文地址:http://blog.csdn.net/cfl20121314/article/details/44042721

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!