精华内容
下载资源
问答
  • Range分区

    2018-11-15 17:12:01
    入门例子: –建立表 CREATE TABLE sale( product_id VARCHAR2(5), ...PARTITION BY RANGE (sale_count) ( PARTITION p1 VALUES LESS THAN (1000), PARTITION p2 VALUES LESS THAN (2000), PARTIT...

    入门例子:
    –建立表
    CREATE TABLE sale(
    product_id VARCHAR2(5),
    sale_count NUMBER(10,2)
    )
    –分区
    PARTITION BY RANGE (sale_count)
    (
    PARTITION p1 VALUES LESS THAN (1000),
    PARTITION p2 VALUES LESS THAN (2000),
    PARTITION p3 VALUES LESS THAN (3000)

    );

    DROP TABLE sale;
    –查看所有分区
    SELECT * FROM user_tab_partitions ORDER BY partition_name ASC ;
    ----分区数据查看
    SELECT * FROM SALE PARTITION (p1) FOR UPDATE ;
    SELECT * FROM SALE PARTITION (p2) FOR UPDATE ;
    SELECT * FROM SALE PARTITION (p3) FOR UPDATE ;
    SELECT * FROM SALE PARTITION (p4) FOR UPDATE ;

    ----分区拓展
    —全表添加分区
    ALTER TABLE SALE ADD PARTITION p4 VALUES LESS THAN (MAXVALUE );
    ----拆分已建立的分区,并与其它分区合并
    ALTER TABLE SALE SPLIT PARTITION p3 AT (3000) INTO (PARTITION p3,PARTITION p4);
    ALTER TABLE SALE DROP PARTITION p4 ; ----删除分区:相应的在此区间内的数据也会丢失
    ----将分区1中的数据改为数值范围在分区2中的数据的时候,需要先enable row movement
    ALTER TABLE SALE ENABLE ROW MOVEMENT ;
    UPDATE SALE SET sale_count = 1322 WHERE product_id = ‘1’;
    ----删除分区索引LOCAL
    drop index id_local;

    INSERT INTO SALE VALUES (‘1’,‘12’);
    INSERT INTO SALE VALUES (‘2’,‘1321’);
    INSERT INTO SALE VALUES (‘3’,‘2001’);
    INSERT INTO SALE VALUES (‘4’,‘4301’);

    分区索引:
    一般建议建立LOCAL的索引,因为GLOBAL的容易所有的都失效,而LOCAL的最多只在某个分区上失效。索引失效必须一个分区的一个分区的REBUILD

    –在sale_count列上创建一个LOCAL的索引
    create index id_sale_count on sale(sale_count) local;
    –查看LOCAL索引 index_name =‘内容必须大写,否则查不出内容’ ----必须具有dba权限才可以查询哦
    select INDEX_NAME,PARTITION_NAME,HIGH_VALUE,STATUS from dba_ind_partitions where index_name=‘ID_SALE_COUNT’;
    ----删除分区索引LOCAL
    DROP INDEX id_sale_count;

    GLOBAL索引

    –创建全局索引
    create index id_sale_count_global on SALE(sale_count) global
    partition by range(sale_count)
    ( partition p1 values less than (10000) ,
    partition p2 values less than (MAXVALUE)
    );

    –查看全局索引
    –dba_ind_partitions查看方式
    select INDEX_NAME,PARTITION_NAME,HIGH_VALUE,STATUS from dba_ind_partitions
    where index_name=‘ID_SALE_COUNT_GLOBAL’;
    –dba_indexes查看方式
    select INDEX_NAME,INDEX_TYPE,TABLE_NAME from dba_indexes where
    index_name=‘ID_SALE_COUNT_GLOBAL’;

    –到底如何判断建立怎样的分区索引(GLOBAL 还是LOCAL)
    –第一种情况:
    – 如果查询的语句的条件是where createdate=‘2012-10-19’ and id>100,则此时查询的是4号分区,
    – 假设他有10万条记录。在扫描这10万条记录的时候,
    – 可以使用id列上的索引。这个时候可以在ID列上建立个local nonprofiex索引
    create index index_tt1_local on TT(id) local
    ( partition p1,
    partition p2,
    partition p3,
    partition p4,
    partition p5
    );
    –查看索引
    select INDEX_NAME,PARTITION_NAME,HIGH_VALUE,STATUS from dba_ind_partitions where index_name=‘INDEX_TT1_LOCAL’;

    –删除索引
    DROP INDEX index_tt1_local;

    – 第二种情况:
    – 如果查询的语句条件只有一个createdate,如where createdate=‘2010-10-19’,
    – 则这种情况就在createdate上建立一个local profiex索引
    create index index_TT2_local on TT(createdate) local;
    –查看索引
    select INDEX_NAME,PARTITION_NAME,HIGH_VALUE,STATUS from dba_ind_partitions where index_name=‘INDEX_TT2_LOCAL’;

    –删除索引
    DROP INDEX index_TT2_local;
    从上面查询可以看出他和表是equi-partitioned.

    – 第三种情况:
    – 如果查询根本就没有createdate,而是有像where id>100的条件,
    – 则就只能在ID列上建立GLOBAL索引了
    create index index_tt3_global on TT(id)
    global partition by range(id)
    (
    partition p1 values less than (100000),
    partition p2 values less than (200000),
    partition p3 values less than (MAXVALUE)
    );
    – 从上面可以看出,GLOBAL的索引的分区数和其基本是没有关系的。
    – 他甚至可以想下面一个建立索引,即一个普通索引。
    – 但是LOCAL的必须和其基本分区数一致。

    展开全文
  • 介绍RANGE分区基于一个给定的连续区间范围,早期版本RANGE主要是基于整数的分区。在5.7版本中DATE、DATETIME列也可以使用RANGE分区,同时在5.5以上的版本提供了基于非整形的RANGE COLUMN分区。RANGE分区必须的连续的...

    介绍

    RANGE分区基于一个给定的连续区间范围,早期版本RANGE主要是基于整数的分区。在5.7版本中DATE、DATETIME列也可以使用RANGE分区,同时在5.5以上的版本提供了基于非整形的RANGE COLUMN分区。RANGE分区必须的连续的且不能重叠。使用

    “VALUES LESS THAN ()” 来定义分区区间,非整形的范围值需要使用单引号,并且可以使用MAXVALUE作为分区的最高值。

    一、RANGE分区

    1.创建分区

    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

    )

    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)

    );

    alter table employees add index ix_store_id(store_id) ;

    alter table employees add index ix_job_code(job_code) ;

    p0:指分区p0,这个分区名的取值可以随便取值只要同一个表里面的每个分区名不重复即可,也不需要非得从0开始,你也可以使用a、b、c、d。

    THEN():分区的范围值,这个值只能的连续不重叠的从小到大的值。

    2.性能分析

    插入测试数据

    insert into employees(id,job_code,store_id) values(1,1001,1),(2,1002,2),(3,1003,3),(4,1004,4);

    Vz6bMn.png

    从执行计划可以看到两个查询都用到了分区的效果;如果细心估计会发现第二个查询没有走索引,并不是使用小于就不会走索引而且执行计划分析评估任务不走索引的效果会更好,事实却是如果当前查询整个分区的数据时使用索引的话还需要去查询其它的字段还不如直接扫描整个分区来的快。

    3.增加分区

    由于当前分区值的范围是小于21,当向分区表中插入一个超过分区范围的值时会报错。这个时候可以增加一个分区,当你不确定需要给一个多大的上限值时可以使用MAXVALUE

    rURVne.png

    alter table employees add PARTITION (PARTITION p4 VALUES LESS THAN MAXVALUE);

    注意:增加分区只能在最大端增加

    4.删除分区

    alter table employees drop PARTITION p4;

    注意:通过这种删除分区的方式会将分区中的数据也删除,慎用!!!!。但是通过删除分区的方式删除数据会比delete快很多,因为它相当于删除一个数据库一样因为每个分区都是一个独立的数据文件。用来删除历史分区数据是非常好的办法。

    5.拆分合并分区

    拆分合并分区统称为重新定义分区,拆分分为不会造成数据的丢失,只将会将数据从一个分区移动到另一个分区。

    例1:将P0拆分成s1,s2两个分区

    ALTER TABLE employees REORGANIZE PARTITION p0 INTO (

    PARTITION s0 VALUES LESS THAN (3),

    PARTITION s1 VALUES LESS THAN (6)

    );

    注意:原来分区p0的范围是[负无穷-6),所以新拆分的分区也必须是这范围,所以新的分区范围值最大不能超过6。

    7zyMza.png

    分区由原来的p0[-6)变成了so[-3),s1[3-6),整个分区的范围还是不变。

    例2:将s1,p1,p2合并为a,b两个分区

    ALTER TABLE employees REORGANIZE PARTITION s1,p1,p2 INTO (

    PARTITION a VALUES LESS THAN (5),

    PARTITION b VALUES LESS THAN (16)

    );

    原本的s1,p1,p2分区范围是:[3-16)所以新的分区也必须和原本的分区相同,所以新的分区的值不能低于3不能高于16即可。

    QFfeQz.png

    分区由原来的s1[3-6),p1[6-11),p2[11-16)变成了现在的a[3-5),b[5-16),总的范围没有发生变化

    注意:无论是拆分还是合并分区都不能改变分区原本的覆盖范围,并且合并分区只能合并连续的分区不能跳过分区合并;并且不能改变分区的类型,例如不能把range分区改成key分区等。

    二、日期字段分区方法

    注意:RANG分区针对日期字段进行分区可以使用时间类型的函数进行转换成整形,但是如果你的查询语句需要利用分区那么查询语句也需要使用相同的时间函数进行查询。

    1.使用YEAR()函数进行分区

    CREATE TABLE employees1 (

    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,

    store_id INT

    )

    PARTITION BY RANGE ( YEAR(separated) ) (

    PARTITION p0 VALUES LESS THAN (1991),

    PARTITION p1 VALUES LESS THAN (1996),

    PARTITION p2 VALUES LESS THAN (2001),

    PARTITION p3 VALUES LESS THAN MAXVALUE

    );

    插入测试数据

    insert into employees1(id,separated,job_code,store_id) values(1,'1990-03-04',1001,1),(2,'1995-03-04',1002,2),(3,'1998-03-04',1003,3),(4,'2016-03-04',1004,4);

    6BV3Qr.png

    对于日期字段分区,查询条件使用> 、< 、betnwen、=都会利用分区查询,如果条件使用函数转换则不会走分区,比如使用YEAR()。

    2.TIMESTAMP类型的列的分区方法

    针对TIMESTAMP的日期类型的字段需要使用专门的UNIX_TIMESTAMP()函数进行转换

    CREATE TABLE quarterly_report_status (

    report_id INT NOT NULL,

    report_status VARCHAR(20) NOT NULL,

    report_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

    )

    PARTITION BY RANGE ( UNIX_TIMESTAMP(report_updated) ) (

    PARTITION p0 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-01-01 00:00:00') ),

    PARTITION p1 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-04-01 00:00:00') ),

    PARTITION p2 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-07-01 00:00:00') ),

    PARTITION p3 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-10-01 00:00:00') ),

    PARTITION p4 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-01-01 00:00:00') ),

    PARTITION p5 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-04-01 00:00:00') ),

    PARTITION p6 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-07-01 00:00:00') ),

    PARTITION p7 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-10-01 00:00:00') ),

    PARTITION p8 VALUES LESS THAN ( UNIX_TIMESTAMP('2010-01-01 00:00:00') ),

    PARTITION p9 VALUES LESS THAN (MAXVALUE)

    );

    三、null值处理

    当往分区列中插入null值RANG 分区会将其当作最小值来处理即插入最小的分区中

    CREATE TABLEtest (

    idINT NOT NULL,

    store_idINT)

    PARTITIONBYRANGE (store_id) (

    PARTITION p0VALUES LESS THAN (6),

    PARTITION p1VALUES LESS THAN (11),

    PARTITION p2VALUES LESS THAN (16),

    PARTITION p3VALUES LESS THAN (21)

    );insert into test(id,store_id) values(1,null);

    SELECTPARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSIONFROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='test';

    7BzURr.png

    备注:文章中的示例摘自mysql官方参考手册

    四、移除表的分区

    ALTER TABLEtablename

    REMOVE PARTITIONING ;

    注意:使用remove移除分区是仅仅移除分区的定义,并不会删除数据和drop PARTITION不一样,后者会连同数据一起删除

    分区系列文章:

    总结

    有两点非常重要需要注意,第一删除分区时要慎重因为会连同分区里的数据一并删除,拆分合并分区新的分区一定要和原来的分区的范围一致。RANGE COLUMN分区单独用章节进行讲解,。

    备注:

    本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接。

    《欢迎交流讨论》

    展开全文
  • 一、简介Range 分区是最常用的一种分区类型。它是根据某个列的值划分为几个连续的区,行数据根据该列的值分别放入到不同的分区。比如:订单表,由于数据量比较大,我们根据年份来把数据存放到不同的区,比如:2010 ...

    为了更好的理解分区表,故写下了此篇文章。希望把自己的每步操作都记录下来。

    一、简介

    Range 分区是最常用的一种分区类型。它是根据某个列的值划分为几个连续的区,行数据根据该列的值分别放入到不同的分区。比如:订单表,由于数据量比较大,我们根据年份来把数据存放到不同的区,比如:2010 年的数据放到p0,2011年的数据放p1,等等。当我们要查询2010年某个月的数据时,我们只需要查询p0这个分区,大大提高了查询的速度。不过需要注意的是在建立分区的时候我们要选择合适的分区方法,否则导致查询语句不能利用分区带来的遍历。因为优化器只能对year(),to_days(),to_seconds(),unix_timestamp()这类函数进行优化。

    year(); 给定一个日期,返回当前日期的年份,例如year('2010-01-01'),返回2010

    to_days(); 返回当前的日期距离公元0年的天数。

    to_seconds(); 把当前日期转换为秒。

    二、 实践

    1.创建一个分区表

    create table t(

    id int

    ) engine=innodb

    partition by range(id) (

    partition p0 values less than(10),

    partition p1 values less than(20)

    );

    执行结果:Query OK, 0 rows affected (0.05 sec)

    查看物理文件如下图所示:

    24f95828891cfb2e7c967f483c65dc97.png

    分区数据文件.png

    分析:发现每个分区都有一个对应的ibd文件。数据物理上是真实分开的。

    往t表中插入几条数据

    insert into t select 9;

    insert into t select 10;

    insert into t select 15;

    当然不是所有大小的数据都能插入成功,比如插入30后会报错,因为30不属于现有的任何分区之内,为此,我们可以加一个maxvalue值的分区。maxvalue可以理解为正无穷,因此所有大于等于20且小于maxvalue的值都放到p2分区。alter table t add partition(partition p2 values less than maxvalue);,这里就不实验了,小伙伴们感兴趣的可以试试。

    为了检测数据是否真实按照要求分区,可以通过information_schema库下的partitions表来查看。

    select * from partitions where table_name = 't' \G;

    看下输出结果:

    eab47b4d98641ed859e4136818f59902.png

    分区展示.png

    其中标红的部分是需要重点看的,我们发现有两个分区,p0分区一行数据,p1分区两行数据。说明数据被分区了。

    对SQL语句的分析

    explain partitions select * from t where id < 9;

    为了结果能展示分区信息这里语句里面加上partitions

    输出结果:

    111759ce5544d3cb9519b692560530d3.png

    explain解析结果.png

    我们发现这条语句仅仅使用了p0分区,因此相比于没有分区之前查询的效率大大提高了。

    接下来我们看下分区失败的一些情况。

    创建分区表

    create table sales1 (

    money int unsigned not null,

    date datetime

    )engine = innodb charset=utf8

    partition by range(year(date)*100 + month(date))(

    partition p201001 values less than(201002),

    partition p201002 values less than(201003),

    partition p201003 values less than(201004)

    );

    执行结果:Query OK, 0 rows affected (0.06 sec)

    查看物理文件如下图所示:

    6843e6c065cf2558797e0700c5cc872e.png

    分区物理文件.png

    在执行上面创建表的语句后mysql 为我们创建了三个partition。

    插入几条数据

    insert into sales1 select 100,'2008-01-01';

    insert into sales1 select 100,'2008-02-01';

    insert into sales1 select 100,'2009-03-01';

    insert into sales1 select 100,'2010-03-01';

    SQL语句分析

    explain partitions select * from sales where date >='2010-01-01' and date <= '2010-01-31';

    这条语句我们预想是只会在p201001这个分区去查询,那真实的执行计划如下图所示:

    c300d0ef6eba036de9560af305aae569.png

    分区执行计划.png

    我们发现并不是我们预想的那样,mysql在查询的过程中扫描了所有的分区表,尽管数据被分配到多个分区。这是因为mysql只对特定的一些函数分区后的表进行查询优化。于是,为了能使用到分区这一特性带来的便利,我们使用其他的方法来进行分区。

    创建分区表

    create table sales1 (

    money int unsigned not null,

    date datetime

    )engine = innodb charset=utf8

    partition by range(to_days(date))(

    partition p201001 values less than(734169),

    partition p201002 values less than(734197),

    partition p201003 values less than(734228)

    );

    insert into sales1 select 100,'2008-01-01';

    insert into sales1 select 100,'2008-02-01';

    insert into sales1 select 100,'2009-03-01';

    insert into sales1 select 100,'2010-03-01';

    explain partitions select * from sales where date >='2010-01-01' and date <= '2010-01-31';

    我们再来看下explain 执行计划

    d92b6174bf0d339a96f155e12d3588cd.png

    执行计划.png

    这个时候就使用了分区。所以大家在使用range分区时要注意使用合适的分区函数,否则会没有效果,甚至是不能得到正确的查询结果。

    展开全文
  • 为了更好的演示range分区,首先对mysql server的启动和关闭进行说明:一,如何启动mysqld?本人把mysql安装在windows环境下,安装的主目录homedir是"c:\Program Files\MySQL\MySQL Server 5.1\",启动方法非常简单:...

    为了更好的演示range分区,首先对mysql server的启动和关闭进行说明:

    一,如何启动mysqld?

    本人把mysql安装在windows环境下,安装的主目录homedir是"c:\Program Files\MySQL\MySQL Server 5.1\",启动方法非常简单:首先进入cmd命令行窗口,如下图:

    1336908324_5329.gif

    执行如下命令:cd c:\Program Files\MySQL\MySQL Server 5.1\,进入mysql安装目录,可以看到bin目录,该目录是存放mysql的各种可执行文件,cd bin,进入该目录,

    找到mysqld.exe的可执行文件,执行mysqld,即启动mysqld,如下图:

    1336917761_1991.gif

    此时,打开任务管理器 - 》进程,可以看到mysqld.exe,表示启动成功。

    1336917868_2033.gif

    二,如何关闭mysqld?

    运行cmd,将路径切换到:c:\Program Files\MySQL\MySQL Server 5.1\bin下,用命令

    mysqladmin -u root -p shutdown

    如下图所示:

    1336918034_9123.gif

    三,innodb_file_per_table设置

    mysql innodb 存储引擎对表空间的管理在默认情况下是使用共享表空间,即所有表的索引和数据均放在一个以ibdata1的文件中,我们可以执行下面的命令查看:

    1336918752_2786.gif

    可以看到对应的Value: OFF,下面我们在配置文件my.ini增加下面一行:

    #tenfy: 新添加的参数

    innodb_file_per_table=1

    然后,重新启动mysqld,此时,可以看到:

    1336918965_5639.gif

    那么,你也许会问,之前在innodb_file_per_table=0的时候已经创建的表,此时还是继续使用共享表空间吗?是的,如果我们不对表进行修改,之前的可以继续使用,但

    将共享表空间修改成独立表空间,除了修改innodb_file_per_table参数外,我们需要修改所有innodb的表都运行如下:

    alter table table_name engine=innodb; (tenfy:注意红色部分必须添加,否则无法生效),一旦执行完成后,我们可以在data的mytest1目录下,看到根据各个分区生成的各个.ibd后缀的文件,这些文件就是独立表空间文件,每个分区对应一个。(关于分区我们将在下面讲解)

    1336919334_5491.gif

    四,mysql分区概述

    分区功能并不是在存储引擎层完成的,因此除了innodb支持分区外,MyISAM,NDB等均支持分区功能,而CSV,FEDERATED,MERGE则不支持分区功能。而MySQL在5.1版本时添加了对分区功能的支持。

    分区是将一个表或者索引物分解成多个更小的,更可管理的部分,而对用户访问db的应用来说,从逻辑上看,只有一个表或者一个索引(这里跟分库分表的访问不一样),但在物理上这个表或者索引可能是由许多个物理分区组成的,每个分区都是一个独立的对象,可以进行独立处理。

    那么怎么判断当前数据库是否启用了分区功能呢?可以执行如下命令进行查看:

    1336919825_1995.gif

    或者:

    1336919936_4411.gif

    当前MySQL支持以下几种分区:

    1,RANGE分区:顾名思义,区间分区,行数据基于一个给定连续区间的列值放入分区。

    2,LIST分区:列表分区,与RANGE分区类似,只是LIST分区面向的是离散可列举的值。

    3,HASH分区:根据用户自定义的表达式的返回值来进行分区,返回值不能是负数。

    4,KEY分区:根据MySQL数据库提供的哈希函数进行分区。

    但是不论什么类型的分区,必须注意以下两个问题:

    1,如果表中存在primary key 或者unique key时,分区的列必须是primary key或者unique key的一个组成部分,也就是说,分区函数的列只能从pk或者uk这些key中取子集。

    如下:

    1336920736_6445.gif

    表par_tb1有唯一key,他们对应的列是col1,col2。而此时进行分区的列却是col3,因此出现1503错误,此时我们把col3加入到unique key或者用col1或者col2进行分区均

    没问题:

    1336921535_5521.gif

    2,如果表中不存在任何的primary key或者unique key,则可以指定任何一个列作为分区列。

    五,RANGE分区。

    RANGE分区是最常用的一种分区类型,它的特点主要是按照某个列连续的值进行分区,因此在分区中常常使用values less than (xxx),下面我们以具体的例子来说明。

    首先我们创建一个表,名字叫:range_par_tbl,有一个int类型的id字段,当id小于10的时候,插入第一个分区,当id小于20的时候插入第二分区。如下:

    1337006577_7649.gif

    此时,我们查看对应的分区表空间文件(注意:因为我们之前设置了innodb_file_per_table=1),此时启用分区后,表已经由建立分区时的各个分区ibd文件组成了,由于我们分了两个区,因此可以看到对应的两个文件:

    1337006765_5523.gif

    可以看到,分区对应的表空间文件命名规则为:表名#p#分区名.ibd

    接下来我们插入一些数据到对应的表里面,看看对应的记录是否真的按照id进行分区:

    1337006999_7992.gif

    可以看到,我们已经成功插入了id分别是9,10,15的三条记录,接下来我们来验证一下,对应的记录是真的存储在对应的分区里面。

    这里我们可以通过查询information_schema.PARTITIONS表来查看每个分区的具体信息:

    1337007302_8378.gif

    说明一下:database() 函数获取当前use 的database,即mytest1 database,关注用红色方框标识部分的内容,可以看到分区p0的table_rows:1,p1的table_rows:2,这就是我们之前插入的记录:9,10,15,其中9 小于10,所以放到第一个分区p0,10和15均是大于等于10且小于20,所以,这两条记录放到分区p1。

    大家也许会问,如果我插入一条记录对应的id 大于20呢?因为没有找到对应的分区,mysql会如何处理?我们继续看下面的代码:

    1337007801_3717.gif

    可以看到,此时mysql提示1526的错误,此时,我们可以增加一个maxvalue的分区,并且插入之前异常的记录,如下:

    1337008028_5483.gif

    range分区常常用于按照日期列的分区,这样非常方便我们进行按照时间或者年份的维度进行分区管理,这在订单类表中非常常见,下面我们以订单表为例子进行说明。

    1337008947_7312.gif

    此时我们按照某种条件进行搜索,看看是否在指定的分区中搜索:

    1337009406_1391.gif

    此时,可以看到,查询优化器只需要去搜索p2008这个分区,而不会搜索所有的分区。

    需要注意的是,分区函数的选择非常重要,如果选择不合适,可能导致查询优化器无法在指定的分区里面进行查找,有人设计了一个表sales,目的是希望按年月进行

    range分区。

    1337696126_8442.gif

    然后插入一些数据后,进行查询,如下所示:

    1337696597_3443.gif

    可以看到查询优化器仍然对分区p201001,p201002,p201003均进行搜索,产生的原因在于分区函数:Range分区函数,查询优化器只能对YEAR(),TO_DAYS(),TO_SECONDS(),UNIX_TIMESTAMP()这些函数进行优化选择,因此上述需要选择TO_DAYS()分区函数进行分区。

    1337697337_2103.gif

    分享到:

    18e900b8666ce6f233d25ec02f95ee59.png

    72dd548719f0ace4d5f9bca64e1d7715.png

    2012-05-13 23:02

    浏览 584

    评论

    展开全文
  • oracle range分区表增加分区

    千次阅读 2017-06-24 17:39:18
    oracle range分区表增加分区
  • Oracle 分区表——Range分区

    千次阅读 2017-06-24 17:19:17
    Oracle 分区表——Range分区
  • MySql采用range分区

    2019-05-16 16:13:24
    RANGE分区基于一个给定的连续区间范围,早期版本RANGE主要是基于整数的分区。在5.7版本中DATE、DATETIME列也可以使用RANGE分区,同时在5.5以上的版本提供了基于非整形的RANGE COLUMN分区。RANGE分区必须的连续的且不...
  • mysql的range分区

    2019-03-11 18:04:33
    mysql的range分区
  • MySQL RANGE分区

    2016-03-17 10:55:00
    2016-07-12 10:18 by pursuer.chen, 5060 阅读, 0 评论, 收藏, 编辑 ...在5.7版本中DATE、DATETIME列也可以使用RANGE分区,同时在5.5以上的版本提供了基于非整形的RANGE COLUMN分区。RANGE分...
  • MySql分区学习总结二:RANGE分区,LIST分区 RANGE分区介绍 在第一节中已经简单的提到过,按照RANGE分区的表示利用取值范围将数据分成区,区间是连续且不能相互叠加的。这个比较好理解,比如我按学号分区,学号在1-...
  • RANGE分区基于一个给定的连续区间范围,早期版本RANGE主要是基于整数的分区。在5.7版本中DATE、DATETIME列也可以使用RANGE分区,同时在5.5以上的版本提供了基于非整形的RANGE COLUMN分区。RANGE分区必须的连续的且不...
  • 在阐述MySQL分区时,我们需要先来了解一下分区的概念是什么,它的优势在哪里,是如何区分类型的。1.分区概述在MySQL中,InnoDB存储引擎长期支持表空间的概念,并且MySQL服务器甚至在分区引入之前,就能配置为存储...
  • 文章目录前言一、分区类型二、RANGE分区1.新建表用来创建分区2.备份旧表3.将新表名称改为旧表 前言 随着MySQL越来越流行,Mysql里面的保存的数据也越来越大。在日常的工作中,我们经常遇到一张表里面保存了上亿甚至...
  • MySQL 横向表分区之RANGE分区小结by:授客 QQ:1033553122目录简介mysql表分区--RANGE分区,属于横向分区。举例说,假如有100条数据,分成十份,前10条数据放到第一个分区,第二个10条数据放到第二个分区,依此类推。...
  • --##test01大小为52G,保存大概两天的数据--##每天数据大约25G...简单range分区(一层分区,每个区大约25G)--##2.range和key复合分区(两层分区,理想状态下均匀分布每个分区大概3G,但从实际历史表分区情况看,...
  • mysql-表分区-range分区

    2019-11-04 13:52:12
    range分区列必须包含在主键中,而且列的每个分区都是一个值区间,每个值区间不能有交集,否则数据插入时,数据库无法确定应该插入到哪个表分区中。 1、已经创建的表添加range分区 分为4个区:p0、p1、p2、p3 p0:...
  • 通过范围的方式进行分区, 为每个分区给出一定的范围, 范围必须是连续的并且不能重复, 使用VALUES LESS THAN操作符让我们先来创建一个range分区的表CREATE TABLE employees (id INT NOT NULL,fname VARCHAR(30),lname...
  • 简介:RANGE分区基于一个给定的连续区间范围,早期版本RANGE主要是基于整数的分区。在5.7版本中DATE、DATETIME列也可以使用RANGE分区,同时在5.5以上的版本提供了基于非整形的RANGE COLUMN分区。RANGE分区必须的连续...
  • 1.range分区:根据分区键值的范围对数据行存储到表的不同分区中;多个分区的范围要连续,但是不能重叠,默认情况下使用values less than属性,即每个分区不包含设置的那个值,上限取不到。 2.使用场景:分区键是...
  • PARTITION RANGE分区创建

    2016-05-23 14:42:23
    range分区是使用最多的一种分区1.range分区简介 以列值的取值范围作为分区的划分条件 按照表的时间列对每月的数据进行分区就是一个很好的range分区的例子。 不在指定范围内的记录会被存储在maxvalue所在的分区 ...
  • mysql RANGE分区

    2017-03-22 16:15:12
    按照RANGE分区的表是通过如下一种方式进行分区的,每个分区包含那些分区表达式的值位于一个给定的连续区间内的行。这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义。在下面的几个例子中,假定...
  • range分区 demo1: 假如一个大型超市有40多家门店,该表保存40家超市的职员记录。这40家超市的的编号从1到40,若果你想将其分成4个小分区,那么你可以采用range分区,创建的数据库表如下: #方式1 CREATE TABLE `...
  • oracle 分区表 Range分区

    2012-04-18 23:42:16
    Range分区:  Range分区是应用范围比较广的表分区方式,它是以列的值的范围来做为分区的划分条件,将记录存放到列值所在的range分区中。  如按照时间划分,2010年1月的数据放到a分区,2月的数据放到b分区,在...
  • 创建range分区

    2012-05-24 14:29:59
    在MySQL中,支持对表创建分区,主要的分区类型有Range分区、List分区、Hash分区、Key分区和子分区。  最近在项目中使用到Range分区,将数据表进行了分区;Range分区基于属于一个给定连续区间的列值,把多行分配给...
  • MySQL 横向表分区之RANGE分区小结 by:授客 QQ:1033553122 目录 简介 1 RANGE分区 1 创建分区表 1 查看表分区 2 新增表分区 2 新增数据 3 分区表查询 3 删除数据 4 删除分区 4 简介 mysql...
  • 介绍RANGE分区基于一个给定的连续区间范围,早期版本RANGE主要是基于整数的分区。在5.7版本中DATE、DATETIME列也可以使用RANGE分区,同时在5.5以上的版本提供了基于非整形的RANGE COLUMN分区。RANGE分区必须的连续的...
  • 为了更好的演示range分区,首先对mysql server的启动和关闭进行说明:一,如何启动mysqld?本人把mysql安装在windows环境下,安装的主目录homedir是"c:Program FilesMySQLMySQL Server 5.1",启动方法非常简单:首先...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,750
精华内容 1,100
关键字:

range分区