MySQL分區(qū)之RANGE分區(qū)詳解
介紹
RANGE分區(qū)基于一個給定的連續(xù)區(qū)間范圍,早期版本RANGE主要是基于整數(shù)的分區(qū)。在5.7版本中DATE、DATETIME列也可以使用RANGE分區(qū),同時在5.5以上的版本提供了基于非整形的RANGE COLUMN分區(qū)。RANGE分區(qū)必須的連續(xù)的且不能重疊。使用
“VALUES LESS THAN ()”來定義分區(qū)區(qū)間,非整形的范圍值需要使用單引號,并且可以使用MAXVALUE作為分區(qū)的最高值。
一、RANGE分區(qū)
1.創(chuàng)建分區(qū)
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:指分區(qū)p0,這個分區(qū)名的取值可以隨便取值只要同一個表里面的每個分區(qū)名不重復(fù)即可,也不需要非得從0開始,你也可以使用a、b、c、d。
THEN():分區(qū)的范圍值,這個值只能的連續(xù)不重疊的從小到大的值。
2.性能分析
插入測試數(shù)據(jù)
insert into employees(id,job_code,store_id) values(1,1001,1),(2,1002,2),(3,1003,3),(4,1004,4);
從執(zhí)行計劃可以看到兩個查詢都用到了分區(qū)的效果;如果細心估計會發(fā)現(xiàn)第二個查詢沒有走索引,并不是使用小于就不會走索引而且執(zhí)行計劃分析評估任務(wù)不走索引的效果會更好,事實卻是如果當(dāng)前查詢整個分區(qū)的數(shù)據(jù)時使用索引的話還需要去查詢其它的字段還不如直接掃描整個分區(qū)來的快。
3.增加分區(qū)
由于當(dāng)前分區(qū)值的范圍是小于21,當(dāng)向分區(qū)表中插入一個超過分區(qū)范圍的值時會報錯。這個時候可以增加一個分區(qū),當(dāng)你不確定需要給一個多大的上限值時可以使用MAXVALUE
alter table employees add PARTITION (PARTITION p4 VALUES LESS THAN MAXVALUE);
注意:增加分區(qū)只能在最大端增加
4.刪除分區(qū)
alter table employees drop PARTITION p4;
注意:通過這種刪除分區(qū)的方式會將分區(qū)中的數(shù)據(jù)也刪除,慎用!?。?!。但是通過刪除分區(qū)的方式刪除數(shù)據(jù)會比delete快很多,因為它相當(dāng)于刪除一個數(shù)據(jù)庫一樣因為每個分區(qū)都是一個獨立的數(shù)據(jù)文件。用來刪除歷史分區(qū)數(shù)據(jù)是非常好的辦法。
5.拆分合并分區(qū)
拆分合并分區(qū)統(tǒng)稱為重新定義分區(qū),拆分分為不會造成數(shù)據(jù)的丟失,只將會將數(shù)據(jù)從一個分區(qū)移動到另一個分區(qū)。
例1:將P0拆分成s1,s2兩個分區(qū)
ALTER TABLE employees REORGANIZE PARTITION p0 INTO ( PARTITION s0 VALUES LESS THAN (3), PARTITION s1 VALUES LESS THAN (6) );
注意:原來分區(qū)p0的范圍是[負無窮-6),所以新拆分的分區(qū)也必須是這范圍,所以新的分區(qū)范圍值最大不能超過6。
分區(qū)由原來的p0[-6)變成了so[-3),s1[3-6),整個分區(qū)的范圍還是不變。
例2:將s1,p1,p2合并為a,b兩個分區(qū)
ALTER TABLE employees REORGANIZE PARTITION s1,p1,p2 INTO ( PARTITION a VALUES LESS THAN (5), PARTITION b VALUES LESS THAN (16) );
原本的s1,p1,p2分區(qū)范圍是:[3-16)所以新的分區(qū)也必須和原本的分區(qū)相同,所以新的分區(qū)的值不能低于3不能高于16即可。
分區(qū)由原來的s1[3-6),p1[6-11),p2[11-16)變成了現(xiàn)在的a[3-5),b[5-16),總的范圍沒有發(fā)生變化
注意:無論是拆分還是合并分區(qū)都不能改變分區(qū)原本的覆蓋范圍,并且合并分區(qū)只能合并連續(xù)的分區(qū)不能跳過分區(qū)合并;并且不能改變分區(qū)的類型,例如不能把range分區(qū)改成key分區(qū)等。
二、日期字段分區(qū)方法
注意:RANG分區(qū)針對日期字段進行分區(qū)可以使用時間類型的函數(shù)進行轉(zhuǎn)換成整形,但是如果你的查詢語句需要利用分區(qū)那么查詢語句也需要使用相同的時間函數(shù)進行查詢。
1.使用YEAR()函數(shù)進行分區(qū)
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 );
插入測試數(shù)據(jù)
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);
對于日期字段分區(qū),查詢條件使用> 、< 、betnwen、=都會利用分區(qū)查詢,如果條件使用函數(shù)轉(zhuǎn)換則不會走分區(qū),比如使用YEAR()。
2.TIMESTAMP類型的列的分區(qū)方法
針對TIMESTAMP的日期類型的字段需要使用專門的UNIX_TIMESTAMP()函數(shù)進行轉(zhuǎn)換
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值處理
當(dāng)往分區(qū)列中插入null值RANG 分區(qū)會將其當(dāng)作最小值來處理即插入最小的分區(qū)中
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官方參考手冊
四、移除表的分區(qū)
ALTER TABLE tablename REMOVE PARTITIONING ;
注意:使用remove移除分區(qū)是僅僅移除分區(qū)的定義,并不會刪除數(shù)據(jù)和drop PARTITION不一樣,后者會連同數(shù)據(jù)一起刪除
分區(qū)系列文章:
RANGE分區(qū):http://www.dbjr.com.cn/article/244269.htm
COLUMN分區(qū):http://www.dbjr.com.cn/article/96515.htm
LIST分區(qū):http://www.dbjr.com.cn/article/244256.htm
HASH分區(qū):http://www.dbjr.com.cn/article/244277.htm
KEY分區(qū):http://www.dbjr.com.cn/article/244282.htm
子分區(qū):http://www.dbjr.com.cn/article/244294.htm
指定各分區(qū)路徑:http://www.dbjr.com.cn/article/244296.htm
分區(qū)索引以及分區(qū)介紹總結(jié):http://www.dbjr.com.cn/article/244300.htm
總結(jié)
有兩點非常重要需要注意,第一刪除分區(qū)時要慎重因為會連同分區(qū)里的數(shù)據(jù)一并刪除,拆分合并分區(qū)新的分區(qū)一定要和原來的分區(qū)的范圍一致。RANGE COLUMN分區(qū)單獨用章節(jié)進行講解,。
到此這篇關(guān)于MySQL分區(qū)之RANGE分區(qū)的文章就介紹到這了,更多相關(guān)MySQL RANGE分區(qū)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
數(shù)據(jù)庫查詢優(yōu)化之子查詢優(yōu)化
今天小編就為大家分享一篇關(guān)于數(shù)據(jù)庫查詢優(yōu)化之子查詢優(yōu)化,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01MySQL數(shù)據(jù)庫分區(qū)功能的使用教程
這篇文章主要介紹了MySQL數(shù)據(jù)庫分區(qū)功能的使用教程,文中特別講解了MySQL分表和分區(qū)的區(qū)別以及聯(lián)系,需要的朋友可以參考下2016-05-05Linux手動部署遠程的mysql數(shù)據(jù)庫的方法詳解
這篇文章主要介紹了Linux手動部署遠程的mysql數(shù)據(jù)庫的方法詳解,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11