mysql 為大表添加索引,導致超時的解決辦法


簡單的創建索引語句 : create unique index inxName on table A('Col') 。 

如果表數據量不大,沒有問題,但是數據超過千萬,可能你等了半天,卻告知你超時了。

網上查到解決方案:

1. 復制表A 的數據結構 , 不復制數據

create table B like A;

2. 表B加上你需要的索引

3. 把原有數據導入新表 

4. 修改表A 的名稱為A_old , 修改B表的 表名為A.  

我的問題出在步驟3. 

使用如下語句導入A表數據到B :

insert into B select * from A; 

執行了半天,又提示錯誤 table x  is full。 

網上找到另一種導入方式,即把A表數據導入文件,然后load 進B表 

select * from A into outfile '/var/money.txt'; 
load data infile '/var/money.txt' into table B; -- 這個路徑需要和show variables like '%secure%'; 一致

我執行的時候提示沒有權限,需要開啟secure_file_priv 相關權限 ,我沒有root用戶權限,所以就放棄該方案了。 

解決: 

insert into B select * from A;   錯誤提示  table x  is full , 那就是一次導入太大。 那我改小點就是了,我們數據2000萬條。

我按照日期 分組 (注意表A 原有按日期的索引),分組后發現最大的一天有700萬條數據。

把導入語句改為 

insert into B select * from A where trans_date = '20190923'; --  執行時間1735s,近30分鍾,還好沒有報錯。

匯總如下: 

 

 100多萬的 46s 搞定,其他數據更少的日期基本幾秒可以搞定,最終1個半小時完成數據復制。 

 

參考文檔: https://www.cnblogs.com/cyq632694540/p/9626727.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM