分區表的組織形式
以年份為分割方式,對表進行分割:
CREATE TABLE `t` (`ftime` datetime NOT NULL,`c` int(11) DEFAULT NULL,KEY (`ftime`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
PARTITION BY RANGE (YEAR(ftime))
(PARTITION p_2017 VALUES LESS THAN (2017) ENGINE = InnoDB,PARTITION p_2018 VALUES LESS THAN (2018) ENGINE = InnoDB,PARTITION p_2019 VALUES LESS THAN (2019) ENGINE = InnoDB,
PARTITION p_others VALUES LESS THAN MAXVALUE ENGINE = InnoDB);
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-eXl2g6NP-1617946354787)(C:\Users\LENOVO\AppData\Roaming\Typora\typora-user-images\1617944262057.png)]
現在插入兩行記錄:
insert into t values('2017-4-1',1),('2018-4-1',1);
這兩行記錄分別被放置在p_2018和p_2019分區上。
對于引擎層,這是四個表;對于server層,這是一個表
需要注意以下幾點:
1、MySQL在第一次打開分區表時,需要訪問所有的分區
2、sever層,認為是同一張表,因此所有分區共用同一個MDL鎖
3、引擎層,認為是不同的表,因此MDL鎖之后的執行過程,會根據分區表規則,只訪問必要的分區
分區表應用場景
分區表優勢:對業務透明,相對于用戶分表來說,使用分區表的業務代碼更簡潔。
如果有一個長時間業務,有一個根據時間刪除歷史數據的需求。此時,按照時間分區的分區表,就可以直接通過alter table t drop partition
語句刪掉分區,從而刪掉過期的歷史數據。
分區表使用注意點
1、分區并不是越細越好。
2、分區不要提前預留太多,在使用之前預先創建即可。對于沒有數據的歷史分區要及時drop
3、查詢需要跨多個分區取數據,查詢性能下降。