MySQL - 子查詢加速
我遇到要找出Table A的PData不存在在Table B的PData時,則列印出來或insert到另一張表
就會如下寫的SQL
select PData from Table A where PData not in (select PData from Table B);
Table A的資料量90萬筆,Table B的資料量300萬筆。
我怕會查很慢,所以我只查Table A的其中一筆資料
select PData from Table A where A.id <=1 and PData not in (select PData from Table B);
結果是5sec時間才完成
幸好沒給他放下去,因為查詢2筆時,是10sec,那查詢90萬筆,就是900000*5 = 4500000sec = 1250 hour。
看來寫程式寫不好,真的是用錯方式才有可能導致跑超慢。
我在嘗試使用not exists的方式試試
select PData from Table A where A.id <=1 and not exists (select PData from Table B where A.PData = B.PData);
一樣也是5sec。
這時候就在TableB 的 PData 下索引
ALTER TABLE `TableB` ADD INDEX(`PData`);
再查詢一筆,毫秒殺。
所以我就下索引,等處理完,再移除不並要的索引就好了。
下索引300萬筆,花費1 min 21sec時間。
但查詢全部90萬筆,只要0.82 sec,速度加快了 5487804.88 倍 ,500萬倍呀。
這次我學會,先用單筆資料做測試、兩筆資料做SQL測試,你就知道速度能加快多少,避免整個資料表被lock住。