中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL COLUMNS分區

發布時間:2020-06-28 13:57:39 來源:網絡 閱讀:442 作者:bxst 欄目:MySQL數據庫

介紹

COLUMN分區是5.5開始引入的分區功能,只有RANGE COLUMN和LIST COLUMN這兩種分區;支持×××、日期、字符串;RANGE和LIST的分區方式非常的相似。

 

 

COLUMNS和RANGE和LIST分區的區別

1.針對日期字段的分區就不需要再使用函數進行轉換了,例如針對date字段進行分區不需要再使用YEAR()表達式進行轉換。

2.COLUMN分區支持多個字段作為分區鍵但是不支持表達式作為分區鍵。

COLUMNS支持的類型

×××支持:tinyint,smallint,mediumint,int,bigint;不支持decimal和float

時間類型支持:date,datetime

字符類型支持:char,varchar,binary,varbinary;不支持text,blob

一、RANGE COLUMNS分區

1.日期字段分區

MySQL COLUMNS分區

CREATE TABLE members (
    id INT,
    joined DATE NOT NULL
)
PARTITION BY RANGE COLUMNS(joined) (
    PARTITION a VALUES LESS THAN ('1960-01-01'),
    PARTITION b VALUES LESS THAN ('1970-01-01'),
    PARTITION c VALUES LESS THAN ('1980-01-01'),
    PARTITION d VALUES LESS THAN ('1990-01-01'),
    PARTITION e VALUES LESS THAN MAXVALUE
);

MySQL COLUMNS分區

1.插入測試數據

insert into members(id,joined) values(1,'1950-01-01'),(1,'1960-01-01'),(1,'1980-01-01'),(1,'1990-01-01');

2.查詢分區數據分布

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='members';

MySQL COLUMNS分區

 當前有5個分區只插入了4條記錄,其中C分區是沒有記錄的,結果和實際一樣。

3.分析執行計劃

explain select id,joined from tb_partition.members where joined=YEAR(now());
explain select id,joined from tb_partition.members where joined='1963-01-01';

MySQL COLUMNS分區

第一條查詢使用了函數導致查詢沒有走具體的分區而是掃描的所有的分區,而第二條查詢執行語句查找具體的分區。

2.多個字段組合分區

MySQL COLUMNS分區

CREATE TABLE rcx (
    a INT,
    b INT
    )
PARTITION BY RANGE COLUMNS(a,b) (
     PARTITION p0 VALUES LESS THAN (5,10),
     PARTITION p1 VALUES LESS THAN (10,20),
     PARTITION p2 VALUES LESS THAN (15,30),
     PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE)
);

MySQL COLUMNS分區

注意:多字段的分區鍵比較是基于數組的比較。它先用插入的數據的第一個字段值和分區的第一個值進行比較,如果插入的第一個值小于分區的第一個值那么就不需要比較第二個值就屬于該分區;如果第一個值等于分區的第一個值,開始比較第二個值同樣如果第二個值小于分區的第二個值那么就屬于該分區。

MySQL COLUMNS分區

例如:

insert into rcx(a,b)values(1,20),(10,15),(10,30);

第一組值:(1,20);1<5所以不需要再比較20了,該記錄屬于p0分區。

第二組值:(10,15),10>5,10=10且15<20,所以該記錄屬于P1分區

第三組值:(10,30),10=10但是30>20,所以它不屬于p1,它滿足10<15所以它屬于p2

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='rcx';

MySQL COLUMNS分區

 注意:RANGE COLUMN的多列分區第一列的分區值一定是順序增長的,不能出現交叉值,第二列的值隨便,例如以下分區就會報錯

PARTITION BY RANGE COLUMNS(a,b) (
     PARTITION p0 VALUES LESS THAN (5,10),     PARTITION p1 VALUES LESS THAN (10,20),
     PARTITION p2 VALUES LESS THAN (8,30),
     PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE)
);

由于分區P2的第一列比P1的第一列要小,所以報錯,后面的分區第一列的值一定要比前面分區值要大,第二列沒規定。

二、LIST COLUMNS分區

1.非×××字段分區

MySQL COLUMNS分區

CREATE TABLE listvar (
    id INT NOT NULL,
    hired DATETIME NOT NULL)
PARTITION BY LIST COLUMNS(hired) 
(
    PARTITION a VALUES IN ('1990-01-01 10:00:00','1991-01-01 10:00:00'),
    PARTITION b VALUES IN ('1992-01-01 10:00:00'),
    PARTITION c VALUES IN ('1993-01-01 10:00:00'),
    PARTITION d VALUES IN ('1994-01-01 10:00:00')
);ALTER TABLE listvar ADD INDEX ix_hired(hired);INSERT INTO listvar() VALUES(1,'1990-01-01 10:00:00'),(1,'1991-01-01 10:00:00'),(1,'1992-01-01 10:00:00'),(1,'1993-01-01 10:00:00');

MySQL COLUMNS分區

LIST COLUMNS分區對分×××字段進行分區就無需使用函數對字段處理成×××,所以對非×××字段進行分區建議選擇COLUMNS分區。

MySQL COLUMNS分區

EXPLAIN SELECT * FROM listvar WHERE hired='1990-01-01 10:00:00';

MySQL COLUMNS分區

 2.多字段分區

MySQL COLUMNS分區

CREATE TABLE listvardou (
    id INT NOT NULL,
    hired DATETIME NOT NULL)
PARTITION BY LIST COLUMNS(id,hired) 
(
    PARTITION a VALUES IN ( (1,'1990-01-01 10:00:00'),(1,'1991-01-01 10:00:00') ),
    PARTITION b VALUES IN ( (2,'1992-01-01 10:00:00') ),
    PARTITION c VALUES IN ( (3,'1993-01-01 10:00:00') ),
    PARTITION d VALUES IN ( (4,'1994-01-01 10:00:00') )
);ALTER TABLE listvardou ADD INDEX ix_hired(hired);INSERT INTO listvardou() VALUES(1,'1990-01-01 10:00:00'),(1,'1991-01-01 10:00:00'),(2,'1992-01-01 10:00:00'),(3,'1993-01-01 10:00:00');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='listvardou';

MySQL COLUMNS分區

MySQL COLUMNS分區

EXPLAIN SELECT * FROM listvardou WHERE id=1 and hired='1990-01-01 10:00:00';

MySQL COLUMNS分區

由于分區是組合字段,filtered只有50%,對于組合分區索引也最好是建組合索引,其實如果能通過id字段刷選出數據,單獨建id字段的索引也是有效果的,但是組合索引的效果是最好的,其實和非分區鍵索引的概念差不多。

ALTER TABLE listvardou ADD INDEX ix_hired1(id,hired);

MySQL COLUMNS分區

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

 

三、移除表的分區

ALTER TABLE tablename
REMOVE PARTITIONING ;

注意:使用remove移除分區是僅僅移除分區的定義,并不會刪除數據和drop PARTITION不一樣,后者會連同數據一起刪除

 


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

邹城市| 吉隆县| 石狮市| 广安市| 和静县| 杭锦旗| 五峰| 乌兰县| 中卫市| 西吉县| 通江县| 枝江市| 绥棱县| 苗栗市| 垫江县| 商都县| 陇川县| 宁德市| 天祝| 庆城县| 信阳市| 澳门| 靖江市| 黄龙县| 天津市| 景德镇市| 清水县| 浑源县| 怀远县| 宾阳县| 阿图什市| 阜平县| 托克托县| 德安县| 泉州市| 象山县| 慈溪市| 吉木萨尔县| 凌云县| 吉安市| 乌兰县|