如何加快DELETE/LEFT JOIN mysql的查詢速度?
你三分鐘的時間似乎很慢。我的猜測是ID列沒有正確索引。如果你能提供你正在使用的確切表格定義將會有所幫助。
我創建了一個簡單的python腳本來生成測試數據,並針對相同的數據集運行了多個不同版本的刪除查詢。這裏是我的表定義:
drop table if exists a;
create table a
(id bigint unsigned not null primary key,
data varchar(255) not null) engine=InnoDB;
drop table if exists b;
create table b like a;
我然後插入100K行成和25K行到B(其中22.5k的也是一個)。以下是各種刪除命令的結果。順便說一下,我放棄並重新填充了表格之間的表格。
mysql> DELETE FROM a WHERE EXISTS (SELECT b.id FROM b WHERE a.id=b.id);
Query OK, 22500 rows affected (1.14 sec)
mysql> DELETE FROM a USING a LEFT JOIN b ON a.id=b.id WHERE b.id IS NOT NULL;
Query OK, 22500 rows affected (0.81 sec)
mysql> DELETE a FROM a INNER JOIN b on a.id=b.id;
Query OK, 22500 rows affected (0.97 sec)
mysql> DELETE QUICK a.* FROM a,b WHERE a.id=b.id;
Query OK, 22500 rows affected (0.81 sec)
所有的測試都是在Intel酷睿2四核2.5GHz的,2GB內存與Ubuntu 8.10和MySQL 5.0中運行。請注意,一個sql語句的執行仍然是單線程的。
檢查JOIN條件中列上是否有索引。還要檢查這些表是否有刪除觸發器。 – Vatev
您可以請「解釋」查詢,看看優化器實際工作如何執行查詢 – avisheks
如何檢查這些列上是否有索引? – Alex