每個公司針對資料庫的設計都有套方案。最近在巡檢表的設計,發現之前有張表漏掉了針對更新時間欄位updated_at的索引,現在需要加上該索引。
我們都知道,為表增加索引是會對錶進行加鎖處理的。稍有不慎,可能會導致表被鎖後,業務無法進行讀寫操作而產生事故影響,通常都是報錯waiting for meta data lock
。在對錶進行修改時,特別是生產上,我們首先要觀察對應的表此時是否在高併發讀寫(選擇操作時機)、表的量級資訊。
整體思路是:
先建立一張表,結構和原表相同;
在新表上新增索引;
rename新錶為原表的表名,原表換新的名稱;
為原表新增索引;
待索引建立成功後,rename原表為原來的名稱,並將新表裡的資料匯入到原表中
sql可參考:
-- 假設需要新增索引的表為`fea_moni_res`
-- 1. 新建與表`fea_moni_res`同結構的表
create table fea_moni_res_tmp like fea_moni_res;
-- 2. 新表上新增索引
alter table fea_moni_res_tmp add index idx_index_name (col_name);
-- 3. *rename*新錶為原表的表名,原表換新的名稱
rename table fea_moni_res to fea_moni_res_1, fea_moni_res_tmp to fea_moni_res;
-- 4. 為原表新增索引,此步耗時較長
alter table fea_moni_res_1 add index idx_index_name (col_name);
-- 5. 待索引建立成功後,rename原表為原來的名稱,並將新表裡的資料匯入到原表中
rename table fea_moni_res to fea_moni_res_tmp, fea_moni_res_1 to fea_moni_res;
-- 需要根據業務來確定如果匯入資料
insert into fea_moni_res(col_name1, col_name2) select col_name1, col_name2 from fea_moni_res_tmp;
本文提供了一種為大表新增索引的方法。當然,此方案不是完美的。譬如,步驟3中的rename操作後,是極有可能會對業務產生影響的,因為業務需要根據歷史資料來判斷邏輯。此時可能不得不在步驟2之後,先行將原表中的資料匯入到新錶中,待完全匯入後再直接切表操作。此需要根據業務的場景來判斷,具體問題具體分析。
此處只是提供了一種方案,涉及到為大表新增字段、刪除欄位的表鎖操作均可參考。
plsql中修改表索引名稱 VBA工作表的引用方法
工作表說明 1 使用工作表的名稱 worksheets 彙總表 select 彙總表被選中 2 使用工作表的索引號 worksheets 3 select sheet4表被選中 worksheets 4 select 財務部表被選中 3 使用工作表的 名稱 工作表的 名稱顯示在vbe工程資源管理器視...
mysql大表修改表名原理 mysql大表修改結構
alter table執行時會對原表進行臨時複製,在副本上進行更改,然後刪除原表,再對新錶進行重新命名。在執行alter table時,其它使用者可以閱讀原表,但是對錶的更新和修改的操作將被延遲,直到新錶生成為止。新錶生成後,這些更新和修改資訊會自動轉移到新表上。注意,如果您在執行alter tab...
NPOI修改excel 的工作表名稱
因為工作上有個呼叫儲存過程的需求,但是excle表中色sheet名字有特殊符號。導致儲存過程一直報錯。無奈只能修改sheet名字,摸索了半天,才把 寫好。現如今把 記錄下來,方便以後可以隨時檢視。修改sheet名字 hisfile為原檔案位址 iworkbook workbook null if s...