前言
在最近的專案中,我們需要儲存大量的資料,而且這些資料是有有效期的,為了提供查詢效率以及快速刪除過期資料,我們選擇了mysql的分割槽機制。把資料按照時間進行分割槽。
分割槽型別
range分割槽:最為常用,基於屬於乙個給定連續區間的列值,把多行分配給分割槽。最常見的是基於時間欄位. 基於分割槽的列最好是整型,如果日期型的可以使用函式轉換為整型。
list分割槽:list分割槽和range分割槽類似,區別在於list是列舉值列表的集合,range是連續的區間值的集合。
hash分割槽:基於給定的分割槽個數,將資料分配到不同的分割槽,hash分割槽只能針對整數進行hash,對於非整形的字段只能通過表示式將其轉換成整數。
key分割槽:key分割槽其實跟hash分割槽差不多,不同點如下:
key分割槽允許多列,而hash分割槽只允許一列。
如果在有主鍵或者唯一鍵的情況下,key中分割槽列可不指定,預設為主鍵或者唯一鍵,如果沒有,則必須顯性指定列。
key分割槽物件必須為列,而不能是基於列的表示式。
key分割槽和hash分割槽的演算法不一樣,partition by hash (expr),mod取值的物件是expr返回的值,而partition by key (column_list),基於的是列的md5值。
分割槽命令
建立分割槽
create table `access_log` (
`id` int(11) not null auto_increment,
`access_time` datetime not null,
primary key (`id`,`access_time`)
) engine=innodb default charset=utf8
/*!50100 partition by range (to_days(access_time))
(partition p1 values less than (to_days(20190101)) engine = innodb,
partition p2 values less than (to_days(20190102)) engine = innodb,
partition p3 values less than (to_days(20190103)) engine = innodb) */;
建立後可以看到,每個分割槽都會對應1個ibd檔案
分割槽表新增分割槽
alter table access_log add partition(
partition p4 values less than (to_days('20190105'))
刪除分割槽
alter table access_log drop partition p1;
拆分分割槽
alter table access_log reorganize partition p4 into(
-> partition s0 values less than(to_days('20190104')),
-> partition s1 values less than(to_days('20190105'))
合併分割槽
alter table access_log reorganize partition s0,s1 into (
partition p4 values less than (to_days('20190105'))
注意事項
mysql分割槽中如果存在主鍵或唯一鍵,則分割槽列必須包含在其中(否則判斷主鍵或唯一時,需要掃瞄所有分割槽)
分割槽字段不能為null,要不然怎麼確定分割槽範圍呢,所以盡量not null
最大分割槽數目不能超過1024
不支援外來鍵
只能對資料表的整型列進行分割槽,或者資料列可以通過分割槽函式轉化成整型列
分割槽表不影響自增列
常見問題
a primary key must include all columns in the table's partitioning function:這樣的話判斷主鍵是否唯一就可以在單個分割槽內部完成,否則就需要跨所有的分割槽
maxvalue can only be used in last partition definition:range表分割槽後不能帶maxvalue分割槽,否則無法增加分割槽。或者就只能重新分割槽了
alter table access_log partition by range(to_days(access_time))(
partition p1 values less than (to_days('20191202')),
partition p2 values less than (to_days('20191203')),
partition po values less than (maxvalue)
table has no partition for value 737425:因為分割槽的範圍沒有包含所有可能的記錄的值
參考how to resolve error 1481 (hy000): maxvalue can only be used in last partition definition
總結
mysql 分表分割槽
一 分表 1 垂直分割 就是將乙個表按照欄位來分,每張表保證有相同的主鍵就好。一般來說,將常用字段和大字段分表來放。優勢 比沒有分表來說,提高了查詢速度,降低了查詢結果所用記憶體 劣勢 沒有解決大量記錄的問題,對於單錶來說隨著記錄增多,效能還是下降很快 2 水平分割 水平分割是企業最常用到的,水平拆...
mysql分表與分割槽
1 首先得確認mysql是否支援分割槽功能,這可以通過命令 show plugins 檢視如果顯示如下,則說明你的mysql版本支援partition 2 innodb一般用於具有事務和外來鍵的場合,它預設將所有的表資料和索引檔案放在乙個名為ibdata1的檔案中,屬於共享表空間。myisam預設每...
MySQL分割槽和分表
1.分割槽的型別 1 range 把連續區間按範圍劃分 例 create table user id int 11 money int 11 unsigned not null,date datetime partition by range year date partition p2014 va...