簡單的創建索引語句 : 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