2014-03-27 109 views
0

在一個MySQL數據庫(在Linux上運行),我做了以下查詢:如何加快這個DELETE/LEFT JOIN mysql查詢?

delete m,i from Table1 AS m 
LEFT JOIN 
Table2 AS i 
ON m.GUID = i.OutId 
WHERE m.Direction='in' 
AND m.Id<4294967296 

這需要近2分鐘的時間! Table1有458個條目,Table2有5659個條目。

爲什麼這個查詢會消耗這麼多時間? COUNT查詢來計算Table2中僅用0.24秒進行比較的元素。

如何加快此查詢?哪些部件耗時?

其他信息:

  • 我沒有sql專家
  • 我試圖通過運行alter table Table add index (GUID);(以及類似的命令爲其它列)添加索引表,但似乎它有沒有影響時間消耗。我在這裏做錯了什麼?
  • '優化'或任何必須完成而不改變表結構。
+0

檢查JOIN條件中列上是否有索引。還要檢查這些表是否有刪除觸發器。 – Vatev

+0

您可以請「解釋」查詢,看看優化器實際工作如何執行查詢 – avisheks

+0

如何檢查這些列上是否有索引? – Alex

回答

0

如何加快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語句的執行仍然是單線程的。

+0

請參閱更新的問題。看起來實際的命令更復雜,因爲'SHOW PROCESSLIST'可能只顯示查詢的一部分。索引列也似乎沒有幫助... – Alex