2016-11-20 48 views
1

你能否在下面幫助我?MySQL /從/刪除它爲什麼這麼慢?

MySQL命令之下運行在4秒的現代PC在那裏沒有別的運行,即使在運行多次:

DELETE FROM table1 
WHERE column1 LIKE 'pattern1%' AND 
     column2 IN (SELECT column3 FROM table2 WHERE column4 = 'pattern2') 

table1中含有約其中95%的記錄匹配column1/pattern1%。

table2包含約。其中5000個接近零個匹配column4/pattern2。

主持人:MySQL的V5.7,Ubuntu的16的64位,快速的SSD,InnoDB的游泳池MEM爲1 GB

莫非更簡單或更快的方式做了什麼?謝謝。

查詢計劃:

+----+--------------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+ 
| id | select_type  | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra  | 
+----+--------------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+ 
| 1 | DELETE    | table1 | NULL  | ALL | NULL   | NULL | NULL | NULL | 1179 | 100.00 | Using where | 
| 2 | DEPENDENT SUBQUERY | table2 | NULL  | ALL | NULL   | NULL | NULL | NULL | 4601 |  1.00 | Using where | 
+----+--------------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+ 
+0

請顯示查詢計劃 –

+1

是將column1和column2編入索引?你能告訴我們table1的創建表代碼嗎? – barudo

+0

除了索引,這個查詢看起來相當適合我。請嘗試運行'EXPLAIN'。 –

回答

1

這取決於你的表的大小和索引的配置。

例如,如果table2不是太大,按column4正確索引,並且子查詢的結果也不大,則可以顛倒條件的順序,以便第一個條件執行,並且如果它不執行不匹配,它不會執行潛在的較慢列如查詢。

DELETE FROM table1 
WHERE column2 IN (SELECT column3 FROM table2 WHERE column4 = 'pattern2') AND 
     column1 LIKE 'pattern1%' 
+0

謝謝,我會在一天內測試並寫出結果。 – log69

+0

正如查詢計劃中所示,第4列上沒有索引。這真的需要在那裏才能獲得良好的性能。 – Arjan

+0

@Arjan:我會用一個索引來檢查它,儘管EXPLAIN並沒有像我看到的那樣顯示一個索引的加速。 – log69

0

您需要添加索引,以加快查詢。至少應該有的索引。您可能想要在(column 4, column3)上創建組合索引。

由於您指出table 1中的所有行的約95%匹配column 1,因此爲column 1添加索引確實毫無意義。如果column 2的匹配數量相對較少,則可以爲該列添加索引。

+0

我不想使用索引,因爲這些表格會不斷更新(每分鐘)。 – log69

+0

如果你做了很多插入查詢,你會希望保持索引數量低。但對於其他查詢,您需要一些索引,在這種情況下,您不能沒有。 – Arjan

1

它從EXPLAIN查詢中顯示您的表沒有正確設置索引。索引用於快速查找具有特定列值的行。

一個從指數的表現角度看,最重要的用途是要找到行匹配快速一個WHERE條款。如果沒有索引,MySQL 必須從第一行開始,然後通過整個表讀取以查找相關行。表格越大,成本越高。如果表中有相關​​列的索引,MySQL可以快速確定在數據文件中間尋找的位置,而無需查看所有數據。這比按順序讀取每一行要快得多。

0

我終於通過向table2/column3添加一個索引來解決它。謝謝大家的幫助。