日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL之LIST和LIST COLUMNS分区初探

發布時間:2024/3/12 数据库 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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個區域:

RegionStore ID Numbers
North3, 5, 6, 9, 17
East1, 2, 10, 11, 19, 20
West4, 12, 13, 14, 18
Central7, 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分区初探的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。