每個公司針對資料庫的設計都有套方案。最近在巡檢表的設計,發現之前有張表漏掉了針對更新時間欄位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中修改表索引名稱 大表加索引方案
每個公司針對資料庫的設計都有套方案。最近在巡檢表的設計,發現之前有張表漏掉了針對更新時間欄位updated at的索引,現在需要加上該索引。我們都知道,為表增加索引是會對錶進行加鎖處理的。稍有不慎,可能會導致表被鎖後,業務無法進行讀寫操作而產生事故影響,通常都是報錯waiting for meta ...
跳表 給鍊錶加索引
跳表 在順序鍊錶的基礎上加索引 類似於給書加目錄,把一些章節摘出來當目錄 2.頭節點尾節點都給無窮 integer.maxint 3.鍊錶設定乙個隨機機制 每插入乙個節點隨機是否上公升為索引 查詢 每次查詢data在鍊錶的位置,不用從頭到尾遍歷鍊錶 從最高端索引往下遍歷逐步確定範圍 新增 先通過索引...
mysql給表的字段加索引
1 新增普通索引 alter table table name add index index name column 2 新增主鍵索引 alter table table name addprimary key column 3 新增唯一索引 unique alter table table na...