在mysql 5.6.5及更早版本中,對於
myisam
執行dml或ddl語句時,實際執行表級鎖的
儲存引擎
,影響分割槽表的這種語句對整個**施加了鎖定;
也就是說,所有分割槽都被鎖定,直到語句完成。
mysql 5.6.6實現
分割槽鎖定修剪
,這在許多情況下消除了不必要的鎖定。
在mysql 5.6.6及更高版本中,從分割槽
myisam
表
讀取或更新的大多數語句
只會導致受影響的分割槽被鎖定。
例如,在mysql 5.6.6之前,乙個
select
從分割槽myisam
表導致整個表上的鎖定;
在mysql 5.6.6及更高版本中,
select
只有實際包含滿足語句where
條件的行的那些分割槽才被
鎖定。這具有提高並行操作對分割槽
myisam
表
的速度和效率的作用
。當使用
myisam
具有多個(32個或更多)分割槽的表時,
這種改進變得尤其明顯
。這種行為變化對使用儲存引擎(例如
innodb
採用行級鎖定)
影響分割槽表的語句沒有任何影響,
並且在分割槽修剪之前並不實際執行(或需要執行)鎖定。
接下來的幾段討論使用採用表級鎖的儲存引擎對分割槽鎖定修剪對各種mysql語句的影響。
對dml語句的影響
select
語句(包括含有聯合或連線的語句)現在只鎖定那些實際需要讀取的分割槽。
這也適用於
select ... partition
。 乙個
update
只為表梅幹鎖上沒有分割槽列被更新。
replace
和
insert
現在僅鎖定那些具有要被插入或替換的行分割槽。
但是,如果
auto_increment
為任何分割槽列生成值,則所有分割槽都將被鎖定。
insert ... on duplicate key update
只要沒有分割槽列被更新就被修剪。
insert ... select
現在只鎖定需要讀取的源表中的那些分割槽,儘管目標表中的所有分割槽都被鎖定。 注意
insert delayed
不支援分割槽表。
load data
對分割槽表上的語句
強加的鎖
不能被修剪。
使用分割槽表的任何分割槽列
的存在before insert
或before update
觸發器意味著鎖定insert
和update
更新此表的語句不能被修剪,因為觸發器可以更改其值:before insert
任何表的分割槽列上
的觸發器意味著由
insert
或replace
不能
設定的鎖定
被修剪,因為
before insert
觸發器可能會在插入行之前更改一行的分割槽列,從而強制該行進入與其他分割槽不同的分割槽。
甲before update
上的分割槽列觸發意味著鎖所規定update
或insert ... on duplicate key update
不能被修剪。
受影響的ddl語句
create view
不再造成任何鎖。
alter table ... exchange partition
現在修剪鎖;
只有交換的表和交換的分割槽被鎖定。
alter table ... truncate partition
現在修剪鎖;
只有要清空的分割槽被鎖定。
alter table
語句仍然在表級別上採用元資料鎖。
其他宣告
lock tables
不能修剪分割槽鎖。
call stored_procedure(expr
)
支援鎖定修剪,但評估
expr
不。
do
並且
set
語句不支援分割槽鎖定修剪。
mysql 5 6分割槽維護
mysql 5.6分割槽維護 表和分割槽的一些維護任務,適用於在mysql5.6的分割槽表上用sql語句進行。維護分割槽表,可以使用支援分割槽表的語句 check table,optimize table,analyze table,and repair table 你可以使用alter table...
mysql優化參考 四 分割槽
一 分割槽概念 mysql目前應該是只支援水平分割槽,一般的水平分割槽如果是表,則相當於原來儲存在乙個檔案的表分為多個檔案 應用場景 二 分割槽型別 列表分割槽 列分割雜湊分割槽 key分割槽 子分割槽mysql分割槽如何處理null 三 分割槽管理 四 分割槽修剪 五 分割槽的限制 與儲存引擎相關...
MySQL 5 6分割槽表 入門例子講解
分割槽表是一種粗粒度,簡易的索引策略,適用於大資料的過濾場景.最適合的場景是,沒有合適的索引時,對其中幾個分割槽表進行全表掃瞄.或者只有乙個分割槽表和索引是熱點,而且這個分割槽和索引能夠全部儲存在記憶體中.限制單錶分割槽數不要超過150個,並且注意某些導致無法做分割槽過濾的細節,分割槽表對於單條記錄...