MySQL之LIST和LIST COLUMNS分区初探
閱讀本文時,請先閱讀《MySQL之RANGE和RANGE COLUMNS分區(qū)初見》。
LIST分區(qū)
? ? ? ? MySQL的LIST分區(qū)在許多方面與RANGE分區(qū)有相似之處。例如與RANGE分區(qū)一樣,必須顯式地定義每個分區(qū)。兩者也有如下主要的不同之處:
(1)在LIST分區(qū)中,每個分區(qū)都是基于列值(column value)?與一組值列表(?a set of value lists)的成員關(guān)系來定義和選擇的;而在RANGE分區(qū)中,每個分區(qū)是基于列值與一組連續(xù)的值范圍的成員關(guān)系來定義的;
(2)在LIST分區(qū)中,使用PARTITION BY LIST(expr)來定義,expr是expression的縮寫,表示一個列的值,或者是一個基于列值的表達式,要求expr是整數(shù)值。然后再通過VALUES IN (value_list)定義每一個分區(qū),value_list是逗號分隔的整數(shù)值列表。而在RANGE分區(qū)中,使用PARTITION BY RANGE(expr),然后再通過VALUES LESS THAN(value)定義每個分區(qū),當然,在LIST分區(qū)中,可以只匹配一個值,VALUES IN (value),value可以是NULL;
(3)在LIST分區(qū)中,各個分區(qū)之間不需要特殊的順序,而在RANGE分區(qū)中是需要順序的。
下面看如何創(chuàng)建LIST分區(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,store_id INT );根據(jù)store_id的值,可以將數(shù)據(jù)行分為如下4個區(qū)域:
| North | 3, 5, 6, 9, 17 |
| East | 1, 2, 10, 11, 19, 20 |
| West | 4, 12, 13, 14, 18 |
| Central | 7, 8, 15, 16 |
?可以如下建立LIST分區(qū)表,將不同區(qū)域的數(shù)據(jù)行存儲在不同的分區(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,store_id INT ) PARTITION BY LIST(store_id) (PARTITION pNorth VALUES IN (3,5,6,9,17),PARTITION pEast VALUES IN (1,2,10,11,19,20),PARTITION pWest VALUES IN (4,12,13,14,18),PARTITION pCentral VALUES IN (7,8,15,16) );注:store_id列類型是INT。?
僅刪除數(shù)據(jù),不刪除分區(qū):
ALTER TABLE employees TRUNCATE PARTITION pWest;?刪除分區(qū)(數(shù)據(jù)行同時被刪除):
ALTER TABLE employees DROP PARTITION pWest;效率高于
DELETE FROM employees WHERE store_id IN (4,12,13,14,18);當插入一條不屬于任何分區(qū)的數(shù)據(jù)會怎樣呢?我們舉個例子:
CREATE TABLE h2 (c1 INT,c2 INT) PARTITION BY LIST(c1) ( PARTITION p0 VALUES IN (1, 4, 7), PARTITION p1 VALUES IN (2, 5, 8) );?我們使用DBeaver創(chuàng)建LIST分區(qū)表h2,成功后如圖:
?向h2中插入如下數(shù)據(jù):
?c1=3不在任何分區(qū)中,插入失敗!
當使用一個INSERT語句插入多行時,行為取決于表是否使用事務(wù)存儲引擎。對于InnoDB表,該語句被認為是一個單獨的事務(wù),因此任何不匹配的值都會導致語句完全失敗,并且不會插入行。對于使用非事務(wù)性存儲引擎(如MyISAM)的表,在包含不匹配值的行之前的任何行都會被插入,但在該行之后的任何行不會被插入。
?LIST COLUMNS分區(qū)
? ? ? ??LIST COLUMNS分區(qū)就像RANGE COLUMNS分區(qū)是RANGE分區(qū)的變種一樣,它是LIST分區(qū)的變種。和LIST分區(qū)不同,
(1)在LIST分區(qū)中,PARTITION BY LIST(expr),expr是整數(shù)型的列或者返回值為整數(shù)的列的表達式,而在?LIST COLUMNS分區(qū)中,使用PARTITION BY LIST COLUMNS(column_list),column_list是單個或者多個列名,不再是表達式,事實上,COLUMNS()不允許使用列名以外的表達式;
(2)LIST COLUMNS分區(qū)不再局限于整數(shù)列,如下類型均可以:
-
所有整數(shù)類型:?TINYINT,?SMALLINT,?MEDIUMINT,?INT?(INTEGER), and?BIGINT。
其他數(shù)值類型 ,比如?DECIMAL?和?FLOAT是不支持的。
-
DATE?和?DATETIME;
-
字符串類型:?CHAR,?VARCHAR,?BINARY, 和?VARBINARY,不支持TEXT?和?BLOB。
舉一些例子
基于字符串類型的列,創(chuàng)建LIST COLUMS分區(qū),如下:
CREATE TABLE customers_1 (first_name VARCHAR(25),last_name VARCHAR(25),street_1 VARCHAR(30),street_2 VARCHAR(30),city VARCHAR(15),renewal DATE ) PARTITION BY LIST COLUMNS(city) (PARTITION pRegion_1 VALUES IN('Oskarshamn', 'H?gsby', 'M?nster?s'),PARTITION pRegion_2 VALUES IN('Vimmerby', 'Hultsfred', 'V?stervik'),PARTITION pRegion_3 VALUES IN('N?ssj?', 'Eksj?', 'Vetlanda'),PARTITION pRegion_4 VALUES IN('Uppvidinge', 'Alvesta', 'V?xjo') );基于DATE類型列,創(chuàng)建LIST COLUMNS分區(qū):
CREATE TABLE customers_2 (first_name VARCHAR(25),last_name VARCHAR(25),street_1 VARCHAR(30),street_2 VARCHAR(30),city VARCHAR(15),renewal DATE ) PARTITION BY LIST COLUMNS(renewal) (PARTITION pWeek_1 VALUES IN('2010-02-01', '2010-02-02', '2010-02-03','2010-02-04', '2010-02-05', '2010-02-06', '2010-02-07'),PARTITION pWeek_2 VALUES IN('2010-02-08', '2010-02-09', '2010-02-10','2010-02-11', '2010-02-12', '2010-02-13', '2010-02-14'),PARTITION pWeek_3 VALUES IN('2010-02-15', '2010-02-16', '2010-02-17','2010-02-18', '2010-02-19', '2010-02-20', '2010-02-21'),PARTITION pWeek_4 VALUES IN('2010-02-22', '2010-02-23', '2010-02-24','2010-02-25', '2010-02-26', '2010-02-27', '2010-02-28') );可以如下使用多個列創(chuàng)建分區(qū)表:
CREATE TABLE customers_1 (first_name VARCHAR(25),last_name VARCHAR(25),street_1 VARCHAR(30),street_2 VARCHAR(30),city VARCHAR(15),renewal DATE ) PARTITION BY LIST COLUMNS(city,renewal) (PARTITION pRegion_1 VALUES IN(('Oskarshamn','2010-02-01'), ('H?gsby','2010-02-01'), ('M?nster?s','2010-02-01')),PARTITION pRegion_2 VALUES IN(('Vimmerby','2010-02-01'), ('Hultsfred','2010-02-01'), ('V?stervik','2010-02-01')),PARTITION pRegion_3 VALUES IN(('N?ssj?','2010-02-01'), ('Eksj?','2010-02-01'), ('Vetlanda','2010-02-01')),PARTITION pRegion_4 VALUES IN(('Uppvidinge','2010-02-01'), ('Alvesta','2010-02-01'), ('V?xjo','2010-02-01')) );下一篇:MySQL之HASH分區(qū)和LINEAR HASH分區(qū)初識?
總結(jié)
以上是生活随笔為你收集整理的MySQL之LIST和LIST COLUMNS分区初探的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql columns_MySQL的
- 下一篇: 【FPGA学习笔记】Verilog语言中