MySQL之LIST和LIST COLUMNS分区初探
閱讀本文時,請先閱讀《MySQL之RANGE和RANGE COLUMNS分區初見》。
LIST分區
? ? ? ? MySQL的LIST分區在許多方面與RANGE分區有相似之處。例如與RANGE分區一樣,必須顯式地定義每個分區。兩者也有如下主要的不同之處:
(1)在LIST分區中,每個分區都是基于列值(column value)?與一組值列表(?a set of value lists)的成員關系來定義和選擇的;而在RANGE分區中,每個分區是基于列值與一組連續的值范圍的成員關系來定義的;
(2)在LIST分區中,使用PARTITION BY LIST(expr)來定義,expr是expression的縮寫,表示一個列的值,或者是一個基于列值的表達式,要求expr是整數值。然后再通過VALUES IN (value_list)定義每一個分區,value_list是逗號分隔的整數值列表。而在RANGE分區中,使用PARTITION BY RANGE(expr),然后再通過VALUES LESS THAN(value)定義每個分區,當然,在LIST分區中,可以只匹配一個值,VALUES IN (value),value可以是NULL;
(3)在LIST分區中,各個分區之間不需要特殊的順序,而在RANGE分區中是需要順序的。
下面看如何創建LIST分區表,普通建表語句如下:
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 );根據store_id的值,可以將數據行分為如下4個區域:
| 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分區表,將不同區域的數據行存儲在不同的分區中:
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。?
僅刪除數據,不刪除分區:
ALTER TABLE employees TRUNCATE PARTITION pWest;?刪除分區(數據行同時被刪除):
ALTER TABLE employees DROP PARTITION pWest;效率高于
DELETE FROM employees WHERE store_id IN (4,12,13,14,18);當插入一條不屬于任何分區的數據會怎樣呢?我們舉個例子:
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創建LIST分區表h2,成功后如圖:
?向h2中插入如下數據:
?c1=3不在任何分區中,插入失敗!
當使用一個INSERT語句插入多行時,行為取決于表是否使用事務存儲引擎。對于InnoDB表,該語句被認為是一個單獨的事務,因此任何不匹配的值都會導致語句完全失敗,并且不會插入行。對于使用非事務性存儲引擎(如MyISAM)的表,在包含不匹配值的行之前的任何行都會被插入,但在該行之后的任何行不會被插入。
?LIST COLUMNS分區
? ? ? ??LIST COLUMNS分區就像RANGE COLUMNS分區是RANGE分區的變種一樣,它是LIST分區的變種。和LIST分區不同,
(1)在LIST分區中,PARTITION BY LIST(expr),expr是整數型的列或者返回值為整數的列的表達式,而在?LIST COLUMNS分區中,使用PARTITION BY LIST COLUMNS(column_list),column_list是單個或者多個列名,不再是表達式,事實上,COLUMNS()不允許使用列名以外的表達式;
(2)LIST COLUMNS分區不再局限于整數列,如下類型均可以:
-
所有整數類型:?TINYINT,?SMALLINT,?MEDIUMINT,?INT?(INTEGER), and?BIGINT。
其他數值類型 ,比如?DECIMAL?和?FLOAT是不支持的。
-
DATE?和?DATETIME;
-
字符串類型:?CHAR,?VARCHAR,?BINARY, 和?VARBINARY,不支持TEXT?和?BLOB。
舉一些例子
基于字符串類型的列,創建LIST COLUMS分區,如下:
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類型列,創建LIST COLUMNS分區:
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') );可以如下使用多個列創建分區表:
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分區和LINEAR HASH分區初識?
總結
以上是生活随笔為你收集整理的MySQL之LIST和LIST COLUMNS分区初探的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql columns_MySQL的
- 下一篇: 【FPGA学习笔记】Verilog语言中