MySql分区技术

MySQL的分区技术 与水平分表有点类似,但是它是在逻辑层进行的水平分表,对于应用程序而言它还是一张 表,mysql有5种分区:

  1. RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区
  2. LIST分区 :类似于按RANGE 分区,区别在于LIST分区是基于列值匹配一个离散值集合 中的某个值来进行选择。
  3. HASH分区:基于用户定义 的 表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行 的列值进行计算,这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。
  4. KEY分区: 类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数

1. RANGE分区:常见的如:按年份,日期进行分区。

例1. 假定你创建了一个如下的一个表,该表保存有20家音像店的职员记录,这20家音像店的编号从1到20。 如果你想将其分成4个小分区,那么你可以采用RANGE分区,创建的数据库表如下:

   CREATE TABLE employees (  
         id INT NOT NULL,  
         fname VARCHAR(30),  
         lname VARCHAR(30),  
         hired DATE NOT NULL DEFAULT '1970-01-01',  
         separated DATE NOT NULL DEFAULT '9999-12-31',  
        job_code INT NOT NULL,  
         store_id INT NOT NULL  
          ) ENGINE=Myisam DEFAULT CHARSET=utf8  
         PARTITION BY RANGE (store_id) (  
              PARTITION P0 VALUES LESS THAN (6),  
              PARTITION P1 VALUES LESS THAN (11),  
              PARTITION P2 VALUES LESS THAN (16),  
              PARTITION P3 VALUES LESS THAN (21)  
          );  

这个例子,它的key是一个整型的数据,那是否对于其它类型的字段就无法作为key呢?  答案是否定的,例子2说明这种情况。

例2. 假定你创建了一个如下的一个表,该表保存有20家音像店的职员记录,这20家音像店的编号从1到20。你想把不同时期离职的员工进行分别存储,那么你可以将日期字段separated(即离职时间)作为一个key,创建的SQL语句如下:

     CREATE TABLE employees (  
              id INT NOT NULL,  
              fname VARCHAR(30),  
              lname VARCHAR(30),  
              hired DATE NOT NULL DEFAULT '1970-01-01',  
              separated DATE NOT NULL DEFAULT '9999-12-31',  
              job_code INT NOT NULL,  
              store_id INT NOT NULL  
          ) ENGINE=Myisam DEFAULT CHARSET=utf8  
          PARTITION BY RANGE (YEAR(separated)) (  
              PARTITION P0 VALUES LESS THAN (2001),  
              PARTITION P1 VALUES LESS THAN (2011),  
              PARTITION P2 VALUES LESS THAN (2021),  
              PARTITION P3 VALUES LESS THAN MAXVALUE  
         );  

2. LIST分区

例3:假定你创建了一个如下的一个表,该表保存有20家音像店的职员记录,这20家音像店的编号从1到20。而这20个音响店,分布在4个经销权的地区,如下图所示:


  CREATE TABLE employees (  
          id INT NOT NULL,  
          fname VARCHAR(30),  
          lname VARCHAR(30),  
          hired DATE NOT NULL DEFAULT '1970-01-01',  
          separated DATE NOT NULL DEFAULT '9999-12-31',  
          job_code INT NOT NULL,  
          store_id INT NOT NULL  
      ) ENGINE=Myisam DEFAULT CHARSET=utf8  
      PARTITION BY LIST (store_id) (  
          PARTITION pNorth   VALUES IN (3, 5, 6, 9, 17),  
          PARTITION pEast    VALUES IN (1, 2, 10, 11, 19, 20),  
          PARTITION pWest    VALUES IN (4, 12, 13, 14, 18),  
          PARTITION pCentral VALUES IN (7, 8, 15, 16)  
      ); 

3. HASH分区:

例4:假定你创建了一个如下的一个表,该表保存有20家音像店的职员记录,这20家音像店的编号从1到20。你想把不同时期加入的员工进行分别存储,那么你可以将日期字段hired(即入职时间)作为一个key,创建的SQL语句如下:

 CREATE TABLE employees (  
          id INT NOT NULL,  
          fname VARCHAR(30),  
         lname VARCHAR(30),  
          hired DATE NOT NULL DEFAULT '1970-01-01',  
          separated DATE NOT NULL DEFAULT '9999-12-31',  
         job_code INT NOT NULL,  
         store_id INT NOT NULL  
      ) ENGINE=Myisam DEFAULT CHARSET=utf8  
      PARTITION BY HASH (YEAR(hired)) (  
          PARTITIONS 4  
      );  

不同分区技术的对比:

分区类型
优点
缺点
共性
Range适合于日期类型,支持符合分区有限的分区一般 只针对某一列
List适合于有固定取值 的 列,支持符合分区有限的分区,插入记录在这一列的 值不在list中,则数据丢失一般 只针对某一列
Hash线性Hash使得增加。删除和合并分区更快捷线性Hash的数据分布不均匀,而一般Hash的数据分布较均匀一般 只针对某一列
key列可以分为字符型等其他非int类型效率比较低,因为函数为复杂的 函数(如MD5或 SHA函数)一般 只针对某一列


阅读更多
文章标签: MySql分区技术
个人分类: mysql
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭