mysql 修改分割槽表 分割槽表的資料修改深入

2021-10-17 20:37:42 字數 1728 閱讀 7852

需求案例:student表中儲存學生的資訊,按照班級進行了分割槽,乙個學生轉了班級,他的資訊需要在student表中修改。

student表結構語句

create table student(id number(5),name varchar2(10),class_id number(2)) partition by list(class_id)(partition p_01        values (1),partition p_02 values (2));

測試資料

insert into student values(1,'xiaoming',1);

insert into student values(2,'xiaohong',1);

insert into student values(2,'xiaohua',2);

insert into student values(2,'xiaoyue',2);

commit;

修改xiaoming的id=3,修改後,資料所在的分割槽沒有改變。

update student n set n.id=3 where n.name ='xiaoming';

commit;

修改xiaoming到班級2

update student n set n.class_id=2 where n.name ='xiaoming';

執行會報錯

原因分析:因為分割槽表的資料是按分割槽規則存入不同的分割槽,如果資料修改後,不在乙個分割槽了,資料需要先刪除,再插入新的分割槽,而資料庫中對應的引數未設定,就導致了報錯

解決辦法:

1.匯出需要修改的資料到臨時表,再臨時表中修改資料,刪除原表需要修改的資料,把臨時表的資料插入分割槽表中

優勢:對資料庫不用修改引數,可以保證對系統的效能影響小

劣勢:資料量大的情況,高水位問題會較明顯

create table student_tmp as select * from student n where n.name ='xiaoming';

update student_tmp n set n.class_id=2 where n.name ='xiaoming';

commit;

delete from  student n where n.name ='xiaoming';

commit;

insert into student  select * from student_tmp;

commit;

2.開啟資料庫 row movement

優勢:資料庫可以對分割槽表進行跨分割槽修改

劣勢:由於是對資料庫的引數進行修改,產生的影響較大,需要進行各方面的測試,已考慮對系統的影響降到最低

alter table student enable row movement;

執行了這條語句後,再對分割槽表進行跨分割槽修改資料就沒有問題了

update student n set n.class_id=2 where n.name ='xiaoming';

commit;

結語:實施操作都要根據實際情況,在對分割槽表的跨分割槽修改較頻繁的情況,為了工作方便,可以開啟row movement,但是需要進行監控資料庫,保證資料庫的穩定,這個在生產中是首要考慮,如果資料的修改較少,這種情況還是使用匯出資料的方法吧,穩定是資料庫運維的首條軍規。

mysql分割槽表 MySQL分割槽表的正確使用方法

mysql分割槽表概述 我們經常遇到一張表裡面儲存了上億甚至過十億的記錄,這些表裡面儲存了大量的歷史記錄。對於這些歷史資料的清理是乙個非常頭疼事情,由於所有的資料都乙個普通的表裡。所以只能是啟用乙個或多個帶where條件的delete語句去刪除 一般where條件是時間 這對資料庫的造成了很大壓力。...

MySQL分割槽表

分割槽表是一種粗粒度,簡易的索引策略,適用於大資料的過濾場景.最適合的場景是,沒有合適的索引時,對其中幾個分割槽表進行全表掃瞄.或者只有乙個分割槽表和索引是熱點,而且這個分割槽和索引能夠全部儲存在記憶體中.限制單錶分割槽數不要超過150個,並且注意某些導致無法做分割槽過濾的細節,分割槽表對於單條記錄...

mysql分割槽表

對使用者來說,分割槽表是乙個獨立的邏輯表,但是底層由多個物理子表組成。實現分割槽的 實際上是對一組底層表的控制代碼物件的封裝。mysql在建立表時使用partition by子句定義每個分割槽存放的資料。在執行查詢的時候,優化器會根據分割槽定義過濾那些沒有我們需要資料的分割槽,這樣查詢就無須掃瞄所有...