大表加索引方案

背景

每個公司針對數據庫的設計都有套方案。最近在巡檢表的設計,發現之前有張表漏掉了針對更新時間字段updated_at的索引,現在需要加上該索引。

我們都知道,爲表增加索引是會對錶進行加鎖處理的。稍有不慎,可能會導致表被鎖後,業務無法進行讀寫操作而產生事故影響,通常都是報錯Waiting for meta data lock。在對錶進行修改時,特別是生產上,我們首先要觀察對應的表此時是否在高併發讀寫(選擇操作時機)、表的量級信息

方案

整體思路是:

  1. 先創建一張表,結構和原表相同;
  2. 在新表上添加索引;
  3. rename新表爲原表的表名,原表換新的名稱;
  4. 爲原表新增索引;
  5. 待索引創建成功後,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之後,先行將原表中的數據導入到新表中,待完全導入後再直接切表操作。此需要根據業務的場景來判斷,具體問題具體分析。

此處只是提供了一種方案,涉及到爲大表添加字段、刪除字段的表鎖操作均可參考。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章