MySQL - 子查詢加速

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住。