日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

MySQL最佳實踐之分區表基本類型

瀏覽:26日期:2023-10-14 17:23:04

MySQL分區表概述

隨著MySQL越來越流行,Mysql里面的保存的數據也越來越大。在日常的工作中,我們經常遇到一張表里面保存了上億甚至過十億的記錄。這些表里面保存了大量的歷史記錄。 對于這些歷史數據的清理是一個非常頭疼事情,由于所有的數據都一個普通的表里。所以只能是啟用一個或多個帶where條件的delete語句去刪除(一般where條件是時間)。 這對數據庫的造成了很大壓力。即使我們把這些刪除了,但底層的數據文件并沒有變小。面對這類問題,最有效的方法就是在使用分區表。最常見的分區方法就是按照時間進行分區。 分區一個最大的優點就是可以非常高效的進行歷史數據的清理。

分區類型

目前MySQL支持范圍分區(RANGE),列表分區(LIST),哈希分區(HASH)以及KEY分區四種。下面我們逐一介紹每種分區:

RANGE分區

基于屬于一個給定連續區間的列值,把多行分配給分區。最常見的是基于時間字段. 基于分區的列最好是整型,如果日期型的可以使用函數轉換為整型。本例中使用to_days函數

CREATE TABLE my_range_datetime( id INT, hiredate DATETIME) PARTITION BY RANGE (TO_DAYS(hiredate) ) ( PARTITION p1 VALUES LESS THAN ( TO_DAYS(’20171202’) ), PARTITION p2 VALUES LESS THAN ( TO_DAYS(’20171203’) ), PARTITION p3 VALUES LESS THAN ( TO_DAYS(’20171204’) ), PARTITION p4 VALUES LESS THAN ( TO_DAYS(’20171205’) ), PARTITION p5 VALUES LESS THAN ( TO_DAYS(’20171206’) ), PARTITION p6 VALUES LESS THAN ( TO_DAYS(’20171207’) ), PARTITION p7 VALUES LESS THAN ( TO_DAYS(’20171208’) ), PARTITION p8 VALUES LESS THAN ( TO_DAYS(’20171209’) ), PARTITION p9 VALUES LESS THAN ( TO_DAYS(’20171210’) ), PARTITION p10 VALUES LESS THAN ( TO_DAYS(’20171211’) ), PARTITION p11 VALUES LESS THAN (MAXVALUE) );

p11是一個默認分區,所有大于20171211的記錄都會在這個分區。MAXVALUE是一個無窮大的值。p11是一個可選分區。如果在定義表的沒有指定的這個分區,當我們插入大于20171211的數據的時候,會收到一個錯誤。

我們在執行查詢的時候,必須帶上分區字段。這樣可以使用分區剪裁功能

mysql> insert into my_range_datetime select * from test; Query OK, 1000000 rows affected (8.15 sec)Records: 1000000 Duplicates: 0 Warnings: 0mysql> explain partitions select * from my_range_datetime where hiredate >= ’20171207124503’ and hiredate<=’20171210111230’; +----+-------------+-------------------+--------------+------+---------------+------+---------+------+--------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+-------------------+--------------+------+---------------+------+---------+------+--------+-------------+| 1 | SIMPLE | my_range_datetime | p7,p8,p9,p10 | ALL | NULL | NULL | NULL | NULL | 400061 | Using where |+----+-------------+-------------------+--------------+------+---------------+------+---------+------+--------+-------------+1 row in set (0.03 sec)

注意執行計劃中的partitions的內容,只查詢了p7,p8,p9,p10三個分區,由此來看,使用to_days函數確實可以實現分區裁剪。

上面是基于datetime的,如果是timestamp類型,我們遇到上面問題呢?

事實上,MySQL提供了一種基于UNIX_TIMESTAMP函數的RANGE分區方案,而且,只能使用UNIX_TIMESTAMP函數,如果使用其它函數,譬如to_days,會報如下錯誤:“ERROR 1486 (HY000): Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed”。

而且官方文檔中也提到“Any other expressions involving TIMESTAMP values are not permitted. (See Bug #42849.)”。

下面來測試一下基于UNIX_TIMESTAMP函數的RANGE分區方案,看其能否實現分區裁剪。

針對TIMESTAMP的分區方案

創表語句如下:

CREATE TABLE my_range_timestamp ( id INT, hiredate TIMESTAMP)PARTITION BY RANGE ( UNIX_TIMESTAMP(hiredate) ) ( PARTITION p1 VALUES LESS THAN ( UNIX_TIMESTAMP(’2017-12-02 00:00:00’) ), PARTITION p2 VALUES LESS THAN ( UNIX_TIMESTAMP(’2017-12-03 00:00:00’) ), PARTITION p3 VALUES LESS THAN ( UNIX_TIMESTAMP(’2017-12-04 00:00:00’) ), PARTITION p4 VALUES LESS THAN ( UNIX_TIMESTAMP(’2017-12-05 00:00:00’) ), PARTITION p5 VALUES LESS THAN ( UNIX_TIMESTAMP(’2017-12-06 00:00:00’) ), PARTITION p6 VALUES LESS THAN ( UNIX_TIMESTAMP(’2017-12-07 00:00:00’) ), PARTITION p7 VALUES LESS THAN ( UNIX_TIMESTAMP(’2017-12-08 00:00:00’) ), PARTITION p8 VALUES LESS THAN ( UNIX_TIMESTAMP(’2017-12-09 00:00:00’) ), PARTITION p9 VALUES LESS THAN ( UNIX_TIMESTAMP(’2017-12-10 00:00:00’) ), PARTITION p10 VALUES LESS THAN (UNIX_TIMESTAMP(’2017-12-11 00:00:00’) ));

插入數據并查看上述查詢的執行計劃

mysql> insert into my_range_timestamp select * from test;Query OK, 1000000 rows affected (13.25 sec)Records: 1000000 Duplicates: 0 Warnings: 0mysql> explain partitions select * from my_range_timestamp where hiredate >= ’20171207124503’ and hiredate<=’20171210111230’;+----+-------------+-------------------+--------------+------+---------------+------+---------+------+--------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+-------------------+--------------+------+---------------+------+---------+------+--------+-------------+| 1 | SIMPLE | my_range_timestamp | p7,p8,p9,p10 | ALL | NULL | NULL | NULL | NULL | 400448 | Using where |+----+-------------+-------------------+--------------+------+---------------+------+---------+------+--------+-------------+1 row in set (0.00 sec)

同樣也能實現分區裁剪。

在5.7版本之前,對于DATA和DATETIME類型的列,如果要實現分區裁剪,只能使用YEAR() 和TO_DAYS()函數,在5.7版本中,又新增了TO_SECONDS()函數。

LIST 分區

LIST分區

LIST分區和RANGE分區類似,區別在于LIST是枚舉值列表的集合,RANGE是連續的區間值的集合。二者在語法方面非常的相似。同樣建議LIST分區列是非null列,否則插入null值如果枚舉列表里面不存在null值會插入失敗,這點和其它的分區不一樣,RANGE分區會將其作為最小分區值存儲,HASHKEY分為會將其轉換成0存儲,主要LIST分區只支持整形,非整形字段需要通過函數轉換成整形.

create table t_list( a int(11), b int(11) )(partition by list (b) partition p0 values in (1,3,5,7,9), partition p1 values in (2,4,6,8,0) );

Hash 分區

我們在實際工作中經常遇到像會員表的這種表。并沒有明顯可以分區的特征字段。但表數據有非常龐大。為了把這類的數據進行分區打散mysql 提供了hash分區。基于給定的分區個數,將數據分配到不同的分區,HASH分區只能針對整數進行HASH,對于非整形的字段只能通過表達式將其轉換成整數。表達式可以是mysql中任意有效的函數或者表達式,對于非整形的HASH往表插入數據的過程中會多一步表達式的計算操作,所以不建議使用復雜的表達式這樣會影響性能。

Hash分區表的基本語句如下:

CREATE TABLE my_member ( id INT NOT NULL, fname VARCHAR(30), lname VARCHAR(30), created DATE NOT NULL DEFAULT ’1970-01-01’, separated DATE NOT NULL DEFAULT ’9999-12-31’, job_code INT, store_id INT)PARTITION BY HASH(id)PARTITIONS 4;

注意:

HASH分區可以不用指定PARTITIONS子句,如上文中的PARTITIONS 4,則默認分區數為1。 不允許只寫PARTITIONS,而不指定分區數。 同RANGE分區和LIST分區一樣,PARTITION BY HASH (expr)子句中的expr返回的必須是整數值。 HASH分區的底層實現其實是基于MOD函數。譬如,對于下表

CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY HASH( YEAR(col3) ) PARTITIONS 4; 如果你要插入一個col3為“2017-09-15”的記錄,則分區的選擇是根據以下值決定的:

MOD(YEAR(‘2017-09-01’),4) = MOD(2017,4) = 1

LINEAR HASH分區

LINEAR HASH分區是HASH分區的一種特殊類型,與HASH分區是基于MOD函數不同的是,它基于的是另外一種算法。

格式如下:

CREATE TABLE my_members ( 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 LINEAR HASH( id )PARTITIONS 4;

說明: 它的優點是在數據量大的場景,譬如TB級,增加、刪除、合并和拆分分區會更快,缺點是,相對于HASH分區,它數據分布不均勻的概率更大。

KEY分區

KEY分區其實跟HASH分區差不多,不同點如下:

KEY分區允許多列,而HASH分區只允許一列。 如果在有主鍵或者唯一鍵的情況下,key中分區列可不指定,默認為主鍵或者唯一鍵,如果沒有,則必須顯性指定列。 KEY分區對象必須為列,而不能是基于列的表達式。 KEY分區和HASH分區的算法不一樣,PARTITION BY HASH (expr),MOD取值的對象是expr返回的值,而PARTITION BY KEY (column_list),基于的是列的MD5值。

格式如下:

CREATE TABLE k1 ( id INT NOT NULL PRIMARY KEY, name VARCHAR(20))PARTITION BY KEY()PARTITIONS 2;

在沒有主鍵或者唯一鍵的情況下,格式如下:

CREATE TABLE tm1 ( s1 CHAR(32))PARTITION BY KEY(s1)PARTITIONS 10;

總結:

MySQL分區中如果存在主鍵或唯一鍵,則分區列必須包含在其中。

對于原生的RANGE分區,LIST分區,HASH分區,分區對象返回的只能是整數值。

分區字段不能為NULL,要不然怎么確定分區范圍呢,所以盡量NOT NULL

到此這篇關于MySQL最佳實踐之分區表基本類型的文章就介紹到這了,更多相關MySQL分區表基本類型內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: MySQL 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲激情欧美| 亚洲乱亚洲高清| 国产乱码精品| 国产亚洲字幕| 国产精品综合色区在线观看| 蜜桃一区二区三区在线| 午夜电影亚洲| 好吊日精品视频| 日韩视频精品在线观看| 在线观看免费一区二区| 亚洲主播在线| 亚洲精品字幕| 青草久久视频| 麻豆精品在线播放| 成人亚洲一区二区| 日韩免费高清| 蜜桃tv一区二区三区| 国产精品老牛| 综合精品一区| 国产图片一区| 毛片不卡一区二区| av中文资源在线资源免费观看| 岛国av在线播放| 在线国产一区| 日韩av一区二区三区四区| 美女视频黄 久久| 成人久久久久| 一区二区国产精品| 免费视频一区二区三区在线观看| 色爱综合网欧美| 亚洲免费高清| 国产精品99久久免费| 日韩综合精品| 亚洲无线观看| 精品一区二区三区四区五区| 久久精品卡一| 亚洲精品乱码久久久久久蜜桃麻豆| 国产欧美自拍一区| 日韩国产网站| 日本在线观看不卡视频| 成人午夜毛片| 视频在线观看91| 久久av国产紧身裤| 免费精品国产的网站免费观看| 亚洲精品欧美| 欧美韩日一区| 一级成人国产| 欧美日韩免费看片| 日本不卡一区二区三区| 欧美www视频在线观看| 亚洲制服少妇| 欧美黑人做爰爽爽爽| 亚洲天堂久久| 国产精品一级| 91九色精品| 国产精品毛片视频| 一区视频在线| 欧美成人一二区| 久久不射网站| 久久男人av资源站| 青青草91视频| 五月综合激情| 精品精品久久| 五月激激激综合网色播| 国产综合色区在线观看| 国产乱论精品| 另类av一区二区| 亚洲午夜天堂| 日本午夜精品一区二区三区电影 | 亚洲精选成人| 亚洲v在线看| 国产精品三p一区二区| 亚洲精品1区2区| 成人在线免费观看网站| 日本中文字幕一区二区视频| 久久久久久久久99精品大| 国产精品亚洲一区二区在线观看| 九一精品国产| 黄毛片在线观看| 日韩美女精品| aⅴ色国产欧美| 欧美精品高清| 精品免费视频| 国产视频一区二| 蜜桃av一区二区在线观看| 久久久久99| 国产成人免费视频网站视频社区| 日本精品久久| 日韩中文字幕麻豆| 欧美国产91| 成人看片网站| 日本激情一区| 免费在线成人| 国产精品一区二区av日韩在线| 久久不射中文字幕| 日本不卡免费高清视频在线| 国产精品一级| 欧美日韩99| 色综合视频一区二区三区日韩| 尤物精品在线| 欧美69视频| 欧美sss在线视频| 国产精品成久久久久| 欧美激情aⅴ一区二区三区| 日本午夜精品一区二区三区电影 | 国产午夜精品一区在线观看| 石原莉奈一区二区三区在线观看| 人人香蕉久久| 99国产精品免费视频观看| 欧美www视频在线观看| 久久这里只有| 欧美成人一二区| 麻豆视频久久| 国产成人1区| 黑人精品一区| 国产日韩电影| 亚洲综合电影| 日韩av首页| 久久久久美女| 久久精品国产68国产精品亚洲| 亚洲精品88| 日韩理论片av| 国产91一区| 国产综合婷婷| 激情五月色综合国产精品| 免费精品国产| 日韩精品一级二级| 亚洲一区av| 69堂精品视频在线播放| 青草久久视频| 欧美激情视频一区二区三区免费 | 精品国产网站| 精品精品久久| 韩国精品主播一区二区在线观看| 亚洲伦乱视频| 日韩视频一区| 亚洲免费毛片| 久久精品99国产精品日本| 国产免费av一区二区三区| 国产精品亚洲四区在线观看| 国产精品一站二站| 国产91欧美| 黄色aa久久| 欧美va天堂在线| 伊人精品久久| 国产精品一线| 中文字幕色婷婷在线视频| 亚洲韩日在线| 中文在线日韩| 国产精品最新自拍| 樱桃视频成人在线观看| 亚洲夜间福利| 中文字幕一区二区精品区| 国产视频网站一区二区三区| 精品一区二区男人吃奶 | 亚洲色图国产| 国产精品地址| 国产 日韩 欧美一区| 亚洲一区观看| 国产免费av一区二区三区| а√在线中文在线新版| 欧美成人亚洲| 青青国产91久久久久久| 精品一区二区三区在线观看视频| 中文字幕系列一区| 免费成人在线影院| 国产精品久久| 欧美一区三区| 日韩成人精品一区二区三区| 精品高清久久| 亚洲黑丝一区二区| 91伊人久久| 亚洲91精品| 日本午夜精品久久久久| 九色porny丨国产首页在线| 亚洲综合五月| 高清不卡亚洲| 亚洲一级淫片| 98精品视频| 亚洲三级网站| 国产精品麻豆久久| 亚洲最大av| 久久91导航| 久久国内精品| 蜜臀av免费一区二区三区| 欧美日韩一区自拍| 亚洲成人一区在线观看| 日本午夜精品久久久久| 欧美+亚洲+精品+三区| 国产精品天堂蜜av在线播放| 欧美va天堂在线| 麻豆极品一区二区三区| 性一交一乱一区二区洋洋av| 精品国产中文字幕第一页| 亚洲一区久久| 国产精品xx| 97久久亚洲| 国产精品外国| 国产精品毛片一区二区在线看| 亚洲丝袜美腿一区|