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

2021-10-08 14:38:06 字數 987 閱讀 2308

簡單的建立索引語句 : 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個半小時完成資料複製

mysql 表 索引 mysql 為表新增索引

索引作用 在索引列上,除了上面提到的有序查詢之外,資料庫利用各種各樣的快速定位技術,能夠大大提高查詢效率。特別是當資料量非常大,查詢涉及多個表時,使用索引往往能使查詢速度加快成千上萬倍。例如,有3個未索引的表t1 t2 t3,分別只包含列c1 c2 c3,每個表分別含有1000行資料組成,指為1 1...

mysql建立索引導致鎖表阻塞查詢

慢查詢不一定需要duri資料來源,資料庫自帶相應的記錄表 information schema.processlist show processlist 或者 select from information schema.processlist where command not in sleep ...

mysql查詢因為索引導致表阻塞或死鎖

今天在生產上對錶進行select查詢,導致阻塞死鎖,解決思路 執行show processlist 或者以下sql select from information schema.processlist 我們線上的問題是執行select操作時,建立索引所以導致死鎖,還有select太複雜查詢時間過長導...