大表加索引方案

2021-10-07 14:22:53 字數 1369 閱讀 9271

每個公司針對資料庫的設計都有套方案。最近在巡檢表的設計,發現之前有張表漏掉了針對更新時間欄位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...