mysql分割槽注意 MySQL表分割槽注意事項

2021-10-17 22:26:48 字數 3002 閱讀 2637

1、分割槽列索引約束

若表有primary key或unique key,則分割槽表的分割槽列必須包含在primary key或unique key列表裡,這是為了確保主鍵的效率,否則同一主鍵區的東西乙個在a分割槽,乙個在b分割槽,顯然會比較麻煩。

2、各分割槽型別條件

range 每個分割槽包含那些分割槽表示式的值位於乙個給定的連續區間內的行。這些區間要連續且不能相互重疊

list只支援整形欄位或返回整形數的表示式,每個分割槽列表裡的值列表必須整數

hash型別只支援整形欄位或返回整形數的表示式

key型別只支援列名形式(可乙個或多個列名),不支援表示式

3、分割槽可用函式

abs()

ceiling() (see ceiling() and floor(), immediately following this list)

day()

dayofmonth()

dayofweek()

dayofyear()

datediff()

extract()

floor() (see ceiling() and floor(), immediately following this list)

hour()

microsecond()

minute()

mod()

month()

quarter()

second()

time_to_sec()

to_days()

weekday()

year()

yearweek()

注意:因為分割槽函式不包括from_unixtime函式,所以用時間戳轉時間來分割槽就無法實現了,只能用date或者datetime來分割槽

例如按年我們可以用:

partition by range (year(date))

按月:partition by range(date div 100)

#div 會把日期變成整數,例如:2014-12-01 -> 20141201、100就是從後面去掉兩位,最後結果是201412

乙個訂單做分割槽的例子:

create table `order` (

`order_id` bigint(19) not null default '0' comment '訂單id:年月日時分秒12位+7位隨機數',

`date` date not null default '0000-00-00' comment '訂單日期',

`amount` int(11) default null comment '支付金額,單位分',

`status` tinyint(1) default '0' comment '0:等待支付 1:支付成功 2:支付失敗 3:驗證失敗',

`addtime` int(10) default null comment '訂單新增時間',

primary key (`order_id`,`date`)

) engine=myisam default charset=utf8;

因為我們沒法用時間戳來做按時間分割槽,所以新增了乙個date欄位,這個欄位和order_id一起作為主鍵,我們知道分割槽的列一定要放到主鍵裡面去的。下面我們用date計算成年月組合來分割槽

alter table order partition by range( date div 100)

partition p_2014_06 values less than (201407),

partition p_2014_07 values less than (201408),

partition p_2014_08 values less than (201409),

partition p_2014_09 values less than (201410),

partition p_2014_10 values less than (201411),

partition p_catch_all values less than maxvalue

以上 less than maxvalue 設定了最後乙個分割槽p_catch_all,所以不能用add的方式來新增分割槽了,以下語句不可用:

alter table order add partition (partition p_2014_11 values less than (201412));

只能把最後的p_catch_all分割槽拆分成兩個,這樣還有乙個好處就是在p_catch_all分割槽的資料不會丟失。資料的合併與拆分用reorganize partition進行。

alter table order reorganize partition p_catch_all into

partition p_2014_11 values less than (201412),

partition p_catch_all values less than maxvalue

合併分割槽:

alter table order reorganize partition p_2014_10,p_2014_11,p_catch_all into

partition p_catch_test values less than maxvalue

為什麼不分到p_catch_all去?因為會報分割槽以存在。

為什麼合併的時候要帶上最後乙個分割槽p_catch_all?因為除了最後乙個分割槽,其他重組的分割槽範圍不能改變總範圍。

刪除分割槽但是不刪除資料:

alter table 表名 remove partitioning

注意:上面語句在5.5可以執行,5.6好像有問題,要先測試一下

分割槽之後,where條件是乙個範圍的話分割槽是不起作用的,如 where date >= '2014-01-01' and date <= '2014-01-31'

一定要用 = 或者 in 條件才行 where date = '2014-01-01' 或者 where date in ('2014-01-01', '2014-01-02', '2014-01-03'...)

mysql表分割槽全文搜尋 Mysql表分割槽

什麼時候使用分割槽 海量資料 資料表索引大於伺服器有效記憶體 分割槽的限制 大部分只能對資料表的整型列進行分割槽,或者資料列可以通過分割槽函式轉化成整型列 其中columns支援 integer string date datetime型別 最大分割槽數目不能超過1024 如果含有唯一索引或者主鍵,...

mysql表分割槽

表分割槽的優點 查詢優化 缺點 除了資料庫管理方面複雜了點,其它的還沒有發現 只有5.1及之後的版本才支付分割槽,同時5.1中分割槽的一些維護的工具還不完善 mysql目前四種分割槽 1range 根據某個列的某種運算進行分割槽,分割槽的標誌都是該列的某種運算後的連續區間 create table ...

mysql 表分割槽

修改表的主鍵 alter table tb channel pv drop primary key,add primary key id channel 測試新增分割槽和刪除分割槽 新增刪除range分割槽 1 建立乙個分割槽 create table titles emp no int not n...