• mysql之数据分区


    一:概述  通过把表分成多几区间,每个区间存储符合特定表达式的数据(即在我们创建分区表时指定每个分区存储的条件例如:PARTITION p0 VALUES LESS THAN (100) 即p0区间存储小于100的数据)。

    二:分区类型 

      即根据每个区间存储值的表达式不同,可分为如下几个类型,一般都是对数字类型或时间类型的数据进行分区。

    2.1 RANGE分区 :即通过表达式 PARTITION p0 VALUES LESS THAN (100)  。即 less小于指定的值存储区间。

    2.2 LIST 分区 :即通过表达式 PARTITION pNorth VALUES IN (3,5,6,9,17)  。即值在in括号里面的值存储区间。

    2.3 HASH 分区 :即通过特定算法(hash)把指定的值放入不同区间。PARTITION BY HASH(id)  PARTITIONS 4。

    2.4 KEY 分区: 和hash分区类似,但指定的列值必须是唯一值(即主键或 UNIQUE KEY),PARTITION BY KEY() PARTITIONS 2;

    2.5 COLUMNS 分区:

    三:分区查询

    语法:

    SELECT
        select_expr [, select_expr ...]
        FROM table_references
        [PARTITION partition_list]  //指定分局
    eg:
    select * from rc1 PARTITION(p0) ; //在标的引用后面加上PARTITION(p,...)函数,参数为表的分区名

    备注:如果我们查询没有添加分区条件,默认是查询所有分区

    四:RANGE分区

     CREATE TABLE `tb_range` (
        ->   `id` int(11) NOT NULL,
        ->   `fname` varchar(30) DEFAULT NULL,
        ->   `lname` varchar(30) DEFAULT NULL
        -> )
        -> PARTITION BY RANGE (id)
        -> (PARTITION p0 VALUES LESS THAN (6),
        -> PARTITION p1 VALUES LESS THAN (11),
        -> PARTITION p2 VALUES LESS THAN MAXVALUE ) ;
    Query OK, 0 rows affected (0.64 sec)
    
    mysql> insert into tb_range(id,fname,lname)values(1,'a1','b1'),(6,'a6','b6'),(10,'a10','b10'),(20,'a20','b20');
    Query OK, 4 rows affected (0.02 sec)
    Records: 4  Duplicates: 0  Warnings: 0
    View Code

    查询:

    mysql> select * from tb_range partition(p0);  //查询p0区的数据
    +----+-------+-------+
    | id | fname | lname |
    +----+-------+-------+
    |  1 | a1    | b1    |
    +----+-------+-------+
    1 row in set (0.00 sec)
    
    mysql> select * from tb_range partition(p2);//查询p2区的数据
    +----+-------+-------+
    | id | fname | lname |
    +----+-------+-------+
    | 20 | a20   | b20   |
    +----+-------+-------+
    1 row in set (0.00 sec)
    
    mysql> select * from tb_range partition(p1);//查询p1区的数据
    +----+-------+-------+
    | id | fname | lname |
    +----+-------+-------+
    |  6 | a6    | b6    |
    | 10 | a10   | b10   |
    +----+-------+-------+
    2 rows in set (0.00 sec)

    五:LIST 分区 

    mysql> CREATE TABLE `tb_list` (
        ->   `id` int(11) NOT NULL,
        ->   `fname` varchar(30) DEFAULT NULL,
        ->   `lname` varchar(30) DEFAULT NULL,
        ->   `class_id` int(11) NOT NULL
        -> )
        -> PARTITION BY LIST(class_id) (
        ->     PARTITION pNorth VALUES IN (1,3),
        ->     PARTITION pEast VALUES IN (2,4)
        -> );
    Query OK, 0 rows affected (0.47 sec)
    
    mysql> insert into tb_list(id,fname,lname,class_id)values(1,'a1','b1',1),(6,'a6','b6',2),(10,'a10','b10',3),(20,'a20','b20',4);
    Query OK, 4 rows affected (0.02 sec)
    View Code

    查询:

    mysql> select * from tb_list partition(pEast);
    +----+-------+-------+----------+
    | id | fname | lname | class_id |
    +----+-------+-------+----------+
    |  6 | a6    | b6    |        2 |
    | 20 | a20   | b20   |        4 |
    +----+-------+-------+----------+
    2 rows in set (0.00 sec)
    
    mysql> select * from tb_list partition(pNorth);
    +----+-------+-------+----------+
    | id | fname | lname | class_id |
    +----+-------+-------+----------+
    |  1 | a1    | b1    |        1 |
    | 10 | a10   | b10   |        3 |
    +----+-------+-------+----------+
    2 rows in set (0.00 sec)

    备注:list方式分区in()参数可以无需

       如果插入不存在的分区,数据库会报错

    六:HASH 分区

    6.1hash散列算法

    mysql> CREATE TABLE tb_hash (
        ->     id INT NOT NULL,
        ->     fname VARCHAR(30),
        ->     lname VARCHAR(30)
        -> )
        -> PARTITION BY HASH(id)
        -> PARTITIONS 3;
    Query OK, 0 rows affected (0.56 sec)
    
    mysql> insert into tb_hash(id,fname,lname)values(1,'a1','b1'),(6,'a6','b6'),(10,'a10','b10'),(20,'a20','b20');
    Query OK, 4 rows affected (0.03 sec)
    Records: 4  Duplicates: 0  Warnings: 0
    View Code

    查询:默认分区为p0,p1....

    mysql> select * from tb_hash partition(p0);
    +----+-------+-------+
    | id | fname | lname |
    +----+-------+-------+
    |  6 | a6    | b6    |
    +----+-------+-------+
    1 row in set (0.00 sec)
    
    mysql> select * from tb_hash partition(p1);
    +----+-------+-------+
    | id | fname | lname |
    +----+-------+-------+
    |  1 | a1    | b1    |
    | 10 | a10   | b10   |
    +----+-------+-------+
    2 rows in set (0.00 sec)
    
    mysql> select * from tb_hash partition(p2);
    +----+-------+-------+
    | id | fname | lname |
    +----+-------+-------+
    | 20 | a20   | b20   |
    +----+-------+-------+
    1 row in set (0.01 sec)

     mysql> select * from tb_hash partition(p3);
      ERROR 1735 (HY000): Unknown partition 'p3' in table 'tb_hash'

    6.2 hash线性算法

    mysql> CREATE TABLE tb_hash_linear (
        ->     id INT NOT NULL,
        ->     fname VARCHAR(30),
        ->     lname VARCHAR(30)
        -> )
        -> PARTITION BY LINEAR HASH(id)
        -> PARTITIONS 3;
    Query OK, 0 rows affected (0.58 sec)
    View Code

    七:KEY 分区

    mysql> CREATE TABLE tb_key (
        ->     id INT NOT NULL PRIMARY KEY,
        ->     name VARCHAR(20)
        -> )
        -> PARTITION BY KEY()
        -> PARTITIONS 2;
    Query OK, 0 rows affected (0.44 sec)

    注意:我们数据库目录存放着我们所有数据库的信息,包括数据库中表的信息和表中数据。其中每个数据库会在该目录下创建一个以数据库名命名文件夹,该文件夹下主要包含.frm和.idb结尾的文件,其中.idb(一个表对应一个)文件存放着每个表的数据。如果我们的表是分区表则一个表对用多个.idb文件。分析下图箭头

     有图可知:

    数据库目录 : /var/lib/mysql

    我查看的数据库为:test3

    普通表一个.frm和一个.idb 而分区表一个.frm和多个.idb文件

  • 相关阅读:
    python中的特殊函数__call__
    python的内存机制
    tf.train.Saver()-tensorflow中模型的保存及读取
    修改过的bug
    JQuery的attr 与 val区别及使用
    多线程处理同一个List测试dome
    synchronized 使用总结
    oracle 自定义函数
    第一天写博客,分享下学习oracle存储过程的过程
    SqlServer
  • 原文地址:https://www.cnblogs.com/jinliang374003909/p/10374924.html
Copyright © 2020-2023  润新知