mysql分割槽教程 MySQL分割槽表的基本入門教程

2021-10-17 14:02:21 字數 2624 閱讀 7234

前言

在最近的專案中,我們需要儲存大量的資料,而且這些資料是有有效期的,為了提供查詢效率以及快速刪除過期資料,我們選擇了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...