1. 程式人生 > >MySQL RANGE分割槽

MySQL 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);

 從執行計劃可以看到兩個查詢都用到了分割槽的效果;如果細心估計會發現第二個查詢沒有走索引,並不是使用小於就不會走索引而且執行計劃分析評估任務不走索引的效果會更好,事實卻是如果當前查詢整個分割槽的資料時使用索引的話還需要去查詢其它的欄位還不如直接掃描整個分割槽來的快。

3.增加分割槽 

 由於當前分割槽值的範圍是小於21,當向分割槽表中插入一個超過分割槽範圍的值時會報錯。這個時候可以增加一個分割槽,當你不確定需要給一個多大的上限值時可以使用MAXVALUE

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。

 

分割槽由原來的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即可。

分割槽由原來的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);

 

對於日期欄位分割槽,查詢條件使用> 、< 、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 TABLE test (
    id INT NOT NULL,
    store_id INT 
)
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)
);
insert into test(id,store_id) values(1,null);
SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION 
FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='test';

備註:文章中的示例摘自mysql官方參考手冊

四、移除表的分割槽

ALTER TABLE tablename
REMOVE PARTITIONING ;

注意:使用remove移除分割槽是僅僅移除分割槽的定義,並不會刪除資料和drop PARTITION不一樣,後者會連同資料一起刪除

分割槽系列文章: 

總結

 有兩點非常重要需要注意,第一刪除分割槽時要慎重因為會連同分割槽裡的資料一併刪除,拆分合並分割槽新的分割槽一定要和原來的分割槽的範圍一致。RANGE COLUMN分割槽單獨用章節進行講解,。

備註:

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連結。

《歡迎交流討論》

相關推薦

MySQL RANGE分割槽

介紹 RANGE分割槽基於一個給定的連續區間範圍,早期版本RANGE主要是基於整數的分割槽。在5.7版本中DATE、DATETIME列也可以使用RANGE分割槽,同時在5.5以上的版本提供了基於非整形的RANGE COLUMN分割槽。RANGE分割槽必須的連續的且不能重疊。使用 “VALUES LES

mysql range分割槽

1、在已經存在表中,修改分割槽表alter table t_fenqu PARTITION by RANGE (TO_DAYS(create_date)) ( PARTITION p0 VALUES

mysql 分割槽range分割槽

首先呢我們來看下怎麼建立一個分割槽表 在上節課的時候 我們也說過 在分割槽的時候 如果分割槽欄位中有主鍵或者唯一索引的列,那麼多有主鍵列和唯一索引列都必須包含進來。 1 ,按照年齡的範圍 create table staff_r12( id int not null auto_inc

修改mysql hash 分割槽range 分割槽,並刪除一個分割槽

----將hash 分割槽修改為range 分割槽,並刪除一個分割槽 mysql> ALTER TABLE orders_range  DROP PARTITION p0; ERROR 1512 (HY000): DROP PARTITION can only be

MySql分割槽學習總結二:RANGE分割槽,LIT分割槽

MySql分割槽學習總結二:RANGE,LIST RANGE分割槽介紹 在第一節中已經簡單的提到過,按照RANGE分割槽的表示利用取值範圍將資料分成區,區間是連續且不能相互疊加的。這個比較好理解,比如我按學號分割槽,學號在1-99的分在一個區內,在100-199的分在另一個區內,這樣

Mysql --分割槽(3)range分割槽

3.分割槽型別 RANGE分割槽 按照range分割槽的表是利用取值範圍將資料分成分割槽,區間要連續並且不能互相重疊,使用values less than操作符進行分割槽定義 CREATE TABLE tnp ( id INT NOT NU

Mysqlmysql分割槽2 —Range分割槽

按照RANGE分割槽的表是通過如下一種方式進行分割槽的,每個分割槽包含那些分割槽表示式的值位於一個給定的連續區間內的行。這些區間要連續且不能相互重疊,使用VALUES LESS THAN操作符來進行定義。在下面的幾個例子中,假定你建立了一個如下的一個表,該表儲存有20家

MySQL資料表range分割槽例子,按年/按月

檢視分割槽資料量,檢視全庫資料量 USE information_schema; SELECT PARTITION_NAME,TABLE_ROWSFROM INFORMATION_SCHEMA.PARTITIONSWHERE TABLE_NAME = 'sale_data

mysql RANGE 大資料分割槽例項

目錄 目錄 建立分割槽 刪除分割槽 檢視分割槽 建立分割槽 ALTER TABLE lrn_performance PARTITION BY RANGE (user_id)

MySQL主從分割槽和讀寫分離

MySQL主從分割槽、讀寫分離、負載均衡 一個MySQL的伺服器的承載連線的數量是有限的,當超出最大連線數之後,MySQL伺服器就會出現異常或者宕機。 再者,伺服器也可能會壞掉(比如硬碟壞了),這時資料會丟失,所以我們需要考慮資料庫的主從分割槽。 一般大型網站都是讀多寫少,實現讀寫分

MysqlMysql分割槽型別及示例

前言 檢視分割槽: SELECT PARTITION_NAME, PARTITION_METHOD, PARTITION_EXPRESSION, PARTITION_DESCRIPTION, TABLE_ROWS, SUBPARTITION_NAME, SUBPARTITION

Range分割槽

入門例子: –建立表 CREATE TABLE sale( product_id VARCHAR2(5), sale_count NUMBER(10,2) ) –分割槽 PARTITION BY RANGE (sale_count) ( PARTITION p1 VALUES LESS TH

MySQL資料分割槽儲存

MySQL是一種傳統的關係型資料庫,其體積小、速度快、成本低,但是對於大資料量(百萬級以上)的操作顯得有些力不從心。 最近小編使用的MySQL資料庫就面臨了大資料量操作的問題,當資料量達到百萬級之後,查詢速度明顯下降,此時就需要優化提升查詢速度了。 data表分割槽儲存 原理解釋

mysql建立分割槽、儲存統計、定時事件

DROP TABLE IF EXISTS monitor_printer; CREATE TABLE monitor_printer ( id int NOT NULL AUTO_INCREMENT COMMENT '自增長id(主鍵)', monitorId int NOT NULL C

012-- mysql分割槽和分表

分割槽 分割槽就是把一個數據表的檔案和索引分散儲存在不同的物理檔案中。 mysql支援的分割槽型別包括Range、List、Hash、Key,其中Range比較常用: RANGE分割槽:基於屬於一個給定連續區間的列值,把多行分配給分割槽。 LIST分割槽:類似於按RANGE分

Oracle 分割槽表——Range分割槽

本博文少許理論資料來至DBA技術大牛http://blog.csdn.net/tianlesoftware/article/details/4717318,本著實踐式學習,書寫以下博文: 一、什麼是分割槽表        Oracle提供了分割槽技術以支援VLDB(Ver

檢視Mysql分割槽語句

SELECT partition_name part, partition_expression expr, partition_description descr, table_rows FROM INFORMATION_SCHEMA.partitions W

mysql分割槽和分表

分割槽 分割槽就是把一個數據表的檔案和索引分散儲存在不同的物理檔案中。 mysql支援的分割槽型別包括Range、List、Hash、Key,其中Range比較常用: RANGE分割槽:基於屬於一個給定連續區間的列值,把多行分配給分割槽。 LIST分割槽:類似於按

5.【MYSQL分割槽&分庫&分表

Mysql分割槽分庫分表 1.mysql分割槽 1.1Range分割槽 1.2List分割槽 1.3Hash分割槽 1.4 2.水平分割 3.垂直分割 1.m

MySQL LIST分割槽

介紹 LIST分割槽和RANGE分割槽非常的相似,主要區別在於LIST是列舉值列表的集合,RANGE是連續的區間值的集合。二者在語法方面非常的相似。同樣建議LIST分割槽列是非null列,否則插入null值如果列舉列表裡面不存在null值會插入失敗,這點和其它的分割槽不一樣,RANGE分割槽會將其作為最