1. 程式人生 > >mysql 表分割槽 按天分割槽

mysql 表分割槽 按天分割槽

 MySQL表分割槽就是把一張表根據設定好的條件下把表切分成若干個小表相互之間,在MySQL的5.1版本以後就開始支援表分割槽的功能,在使用表的分割槽後會使MySQL中大表在平時查詢統計時效能提升。使用MySQL的表分割槽有以下這些優點:


1.與單個磁碟或檔案系統分割槽相比,可以儲存更多的資料

2.很容易就能刪除不用或者過時的資料

3.一些查詢可以得到極大的優化

4.涉及到 SUM()/COUNT() 等聚合函式時,可以並行進行

5.IO吞吐量更大

在早期的MySQL版本中可以查詢SHOW VARIABLES LIKE 'have_partitioning';變數引數來得知系統中是否會支援表分割槽而在MySQL5.6的版本後就不在使用該引數變數,預設都是支援分割槽功能,但是並不是所有的資料引擎都支援表分割槽的,其中目前可以使用表發分割槽功能引擎有:InnoDB、MyISAM、MEMORY另外還有BLACKHOLE引擎也是支援分割槽,但是BLACKHOLE引擎中的資料一切為空所以在使用分割槽並沒有實際的意義,而使用較為多的就是InnoDB和MyISAM的引擎表上做分割槽,在這裡需要注意的是在使用的時候需要注意在原先是什麼表引擎分割槽的時候就必須是用什麼表引擎,其次在使用InnoDB引擎表時建議開啟innodb_file_per_table(獨立表空間)這樣表空間檔案也是獨立的便於管理,如果是在建立表分割槽時沒有指定分割槽所在的路徑預設是在datedir目錄下的庫資料夾下把表的資料檔案下切分創建出許多小檔案,當然在建表或修改表的時候如果有指定表文件的資料目錄那麼還可以使一張表分割槽後把資料放在不同的磁碟中,最後在使用的做分割槽的欄位上需要定義成主鍵,如果原先有一個主鍵那麼該處就會結合之前的主鍵形成聯合主鍵,同時在該欄位上因為主鍵原因該欄位應該不為NULL,建議在建立表後再ALTER表新增修改表分割槽,這樣可以確保修改建立表分割槽時不容易出錯,因為在MySQL中表分割槽不同於Oracle中可以在建表後分區,分割槽時就會按照所給出的條件把資料劃分至各個分割槽檔案中,當然在MySQL中分割槽後還可以在分割槽的基礎上再進行子分割槽,但是一般情況下一般很少使用,最後需要注意的一點如果刪除分割槽時,也會丟失資料的,所以在刪除表分割槽時需要慎重。其中在MySQL下的分割槽型別有以下四種:


RANGE分割槽:基於屬於一個給定連續區間的列值,把多行分配給分割槽。

LIST分割槽:類似於按RANGE分割槽,區別在於LIST分割槽是基於列值匹配一個離散值集合中的某個值來進行選擇。

HASH分割槽:基於使用者定義的表示式的返回值來進行選擇的分割槽,該表示式使用將要插入到表中的這些行的列值進行計算。這個函式可以包含MySQL 中有效的、產生非負整數值的任何表示式。

KEY分割槽:類似於按HASH分割槽,區別在於KEY分割槽只支援計算一列或多列,且MySQL伺服器提供其自身的雜湊函式。必須有一列或多列包含整數值。

其中我們比較常用的就是分割槽方式就是按欄位中的時間來分割槽那麼就選用RANGE分割槽方式來進行分割槽在這裡就說一說最常用的使用時間條件來進行表分割槽,按時間分割槽可以按照年月日等條件用來分割槽,因為是按時間條件分割槽所以在這裡就選用RANGE分割槽,在這裡分割槽的切條件判斷有三種:


LESS THAN:如果是數值就是小於等於,時間則是小於

LESS THAN MAX:不等於

IN:包含於某某區間

而切分時的條件可以用day()、to_days()等相關時間函式都可以,需要注意的是必須是返回值是整形的。如下有一張表

其中按時間欄位date按天分割槽,首先需要把date欄位改成主鍵,後新增分割槽切分規則


ALTER TABLE `employee_tbl`

DROP PRIMARY KEY,

ADD PRIMARY KEY (`id`, `date`); -- 之前id是主鍵,所以這裡第2主鍵為聯合主鍵

ALTER TABLE `employee_tbl` ADD PRIMARY KEY (`date`);

-- 這裡為了便於管理分割槽名都已“p時間”來命名

ALTER TABLE `employee_tbl` PARTITION BY RANGE (to_days(date)) (

    PARTITION `p20171101` VALUES LESS THAN (to_days('20171101')),

    PARTITION `p20171102` VALUES LESS THAN (to_days('20171102')),

    PARTITION `p20171103` VALUES LESS THAN (to_days('20171103')),

    PARTITION `p20171104` VALUES LESS THAN (to_days('20171104')),

    PARTITION `p20171105` VALUES LESS THAN (to_days('20171105')),

    PARTITION `p20171106` VALUES LESS THAN (to_days('20171106')),

    PARTITION `p20171107` VALUES LESS THAN (to_days('20171107')),

    PARTITION `p20171108` VALUES LESS THAN (to_days('20171108')),

    PARTITION `p20171109` VALUES LESS THAN (to_days('20171109')),

    PARTITION `p20171110` VALUES LESS THAN (to_days('20171110'))

);

這樣按天進行分割槽就創完畢,當然如果感覺不夠滿意還可以重新分割槽,後期新增分割槽也很簡單:

ALTER TABLE employee_tbl ADD PARTITION (PARTITION p20171111 VALUES LESS THAN (TO_DAYS ('2017-11-11')));

刪除分割槽:

ALTER TABLE employee_tbl DROP PARTITION p20171101;

最後我們可以通過查詢MySQL的系統字典庫得知所有的分割槽詳情資訊


SELECT

    *

FROM

    information_schema. PARTITIONS t

WHERE

    t.PARTITION_NAME IS NOT NULL

在分割槽建立後可以通過過程和事件控制自動增加表分割槽。