婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > MySQL最佳實踐之分區表基本類型

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

熱門標簽:怎么更改高德地圖標注 南寧外呼系統招商 博樂電銷機器人 鄭州網絡外呼系統價錢 上海市三維地圖標注 電話機器人是電腦呼號嗎 云南大數據外呼系統 機器人打電銷電話 400電話到哪辦理優惠

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: 0

mysql> 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: 0

mysql> 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分區會將其作為最小分區值存儲,HASH\KEY分為會將其轉換成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分區?;诮o定的分區個數,將數據分配到不同的分區,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;

注意:

  1. HASH分區可以不用指定PARTITIONS子句,如上文中的PARTITIONS 4,則默認分區數為1。
  2. 不允許只寫PARTITIONS,而不指定分區數。
  3. 同RANGE分區和LIST分區一樣,PARTITION BY HASH (expr)子句中的expr返回的必須是整數值。
  4. 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分區差不多,不同點如下:

  1. KEY分區允許多列,而HASH分區只允許一列。
  2. 如果在有主鍵或者唯一鍵的情況下,key中分區列可不指定,默認為主鍵或者唯一鍵,如果沒有,則必須顯性指定列。
  3. KEY分區對象必須為列,而不能是基于列的表達式。
  4. 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臨時表及分區表區別詳解
  • MySQL分區表的基本入門教程
  • MySQL優化之分區表
  • 解決mysql刪除用戶 bug的問題
  • MySQL對window函數執行sum函數可能出現的一個Bug
  • MySQL關于exists的一個bug
  • CentOS 安裝 PHP5.5+Redis+XDebug+Nginx+MySQL全紀錄
  • 關于MySQL分區表的一個性能BUG

標簽:益陽 杭州 澳門 白銀 秦皇島 恩施 寧夏 定西

巨人網絡通訊聲明:本文標題《MySQL最佳實踐之分區表基本類型》,本文關鍵詞  MySQL,最佳,實踐,之,分區表,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL最佳實踐之分區表基本類型》相關的同類信息!
  • 本頁收集關于MySQL最佳實踐之分區表基本類型的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    一本色道久久综合亚洲aⅴ蜜桃| 日韩福利视频导航| 国产精品成人网| 国产馆精品极品| 日韩欧美精品在线| 日本中文字幕一区| 91精品国产91久久综合桃花| 一区二区三区在线观看网站| 93久久精品日日躁夜夜躁欧美| 成人欧美一区二区三区白人 | 久久影院午夜片一区| 久久精品国产999大香线蕉| 欧美日韩在线一区二区| 亚洲丝袜另类动漫二区| 99久久久久久| 亚洲曰韩产成在线| 久久综合色综合88| 色婷婷综合久色| 日韩精品一级二级| 久久蜜桃香蕉精品一区二区三区| 成熟亚洲日本毛茸茸凸凹| 亚洲乱码中文字幕| 日韩欧美一区电影| 91在线国产福利| 免费在线视频一区| 中文字幕在线免费不卡| 日韩精品中午字幕| 色哟哟欧美精品| 精品伊人久久久久7777人| 中文字幕中文字幕一区| 欧美精品丝袜久久久中文字幕| 国产一级精品在线| 亚洲成年人网站在线观看| 国产婷婷一区二区| 4438成人网| 91在线你懂得| 日本大胆欧美人术艺术动态| 国产亚洲精品久| 欧美日韩成人一区| 福利一区二区在线| 精品精品国产高清一毛片一天堂| 99精品久久只有精品| 综合久久国产九一剧情麻豆| 色婷婷久久久久swag精品| 夜色激情一区二区| 日韩一区二区在线看片| 国产黑丝在线一区二区三区| 亚洲女子a中天字幕| 国产精品996| 国产精品久久久久久久裸模| 精品国产乱码久久久久久久 | 另类小说欧美激情| 久久精品一区二区三区不卡 | 国产大陆亚洲精品国产| 日韩午夜电影在线观看| 国产.欧美.日韩| 国产精品全国免费观看高清| 欧美综合在线视频| 男女男精品视频| 亚洲日本一区二区| 日韩一级视频免费观看在线| 成人h动漫精品一区二| 亚洲成人7777| 亚洲日本乱码在线观看| 欧美电影免费观看高清完整版在 | 久久综合久久综合久久| 99久久99久久久精品齐齐| 免费看日韩a级影片| 自拍偷拍国产亚洲| 精品国产乱码久久久久久闺蜜| 99久久国产综合色|国产精品| 午夜精品爽啪视频| 日韩毛片精品高清免费| 91免费版在线看| 色噜噜狠狠色综合欧洲selulu| 亚洲婷婷国产精品电影人久久| 成人激情免费视频| 91在线精品一区二区| 激情综合亚洲精品| 日韩福利视频导航| 亚洲午夜在线电影| 亚洲人123区| 国产精品久久久久影院老司 | 久久理论电影网| 成人精品亚洲人成在线| 欧美精品免费视频| 色成人在线视频| 91在线观看下载| 床上的激情91.| 国产成人av网站| 精品亚洲欧美一区| 国内精品视频666| 日韩在线一二三区| 日韩电影在线免费观看| 亚洲三级小视频| 1区2区3区欧美| 中文字幕在线观看一区二区| 国产欧美日韩精品a在线观看| 精品国产电影一区二区| 欧美一区二区三区在线电影| 欧美在线综合视频| 欧美日韩在线播| 欧美日本韩国一区二区三区视频| 国产成人av电影在线观看| 久久这里只有精品首页| 日韩av网站免费在线| 樱花草国产18久久久久| 国产在线播放一区三区四| 国产成人a级片| 91丨porny丨国产入口| 99re热这里只有精品视频| 91成人免费在线| 精品视频资源站| 欧美久久久一区| 91精品久久久久久久99蜜桃| 欧美一级免费大片| 久久色.com| 中文字幕制服丝袜一区二区三区| 国产色一区二区| 国产精品美女一区二区| 亚洲男同1069视频| 日韩高清不卡一区二区三区| 精品在线一区二区三区| www.欧美.com| 日韩欧美一区中文| 国产精品国产三级国产专播品爱网| 亚洲日本青草视频在线怡红院 | 国产精品久久久久婷婷| 亚洲国产sm捆绑调教视频| 免费在线看成人av| 亚洲va韩国va欧美va精品| 国产老妇另类xxxxx| 色婷婷综合五月| 日韩视频一区二区三区在线播放 | 日韩女优av电影| 国产精品系列在线| 日韩av电影免费观看高清完整版在线观看| 激情久久久久久久久久久久久久久久| 丁香亚洲综合激情啪啪综合| 欧美男生操女生| 中文字幕精品三区| 日韩1区2区日韩1区2区| 97久久精品人人做人人爽| 欧美一级淫片007| 国产欧美一区二区三区在线老狼| 有坂深雪av一区二区精品| 国产精品66部| 欧美mv日韩mv亚洲| 亚洲成人免费在线| 91麻豆精品一区二区三区| 欧美极品另类videosde| 免费观看成人av| 在线影院国内精品| 中文字幕在线观看不卡| 国产一区在线看| 91久久精品国产91性色tv | 精品午夜一区二区三区在线观看| 蜜臀av性久久久久蜜臀aⅴ | 韩国三级在线一区| 日韩一区二区三区免费看| 亚洲蜜臀av乱码久久精品| 国产a视频精品免费观看| 日韩你懂的在线观看| 日日嗨av一区二区三区四区| 欧美系列在线观看| 亚洲卡通欧美制服中文| 成人国产亚洲欧美成人综合网| 久久精品欧美一区二区三区不卡| 精品亚洲国产成人av制服丝袜| 日韩一区二区三免费高清| 日本sm残虐另类| 欧美精品色一区二区三区| 亚洲电影一区二区三区| 91福利社在线观看| 亚洲综合在线五月| 在线观看免费成人| 久久精品国产久精国产爱| 欧美一区二区三区在线看| 全国精品久久少妇| 日韩欧美高清一区| 国产精品中文欧美| 18欧美乱大交hd1984| 在线观看一区二区视频| 一区二区三区精品在线观看| 91黄色在线观看| 日韩av一级片| 欧美日韩精品专区| 美女在线视频一区| 欧美激情一二三区| 一本一道久久a久久精品综合蜜臀| 亚洲精品五月天| 欧美男女性生活在线直播观看| 亚洲高清在线精品| 精品日韩欧美在线| av激情综合网| 日本不卡视频一二三区| 久久综合网色—综合色88| 不卡一区在线观看| 亚洲国产成人精品视频| 在线视频综合导航|