2015-11-05 42 views
0

我想從一系列MySQL表中選擇重複的行。在相同的架構和行的同樣數量的不同表上運行時,下面的查詢...對類似表格的查詢性能大不相同?

SELECT * 
FROM table_name 
WHERE column_name 
IN (SELECT * 
    FROM (SELECT column_name 
      FROM table_name 
      GROUP BY column_name 
      HAVING COUNT(*) > 1 
     ) AS subquery) 
); 

...正在產生完全不同的效果。在一張表中,它會在幾秒鐘內執行,在另一張表中執行相同的數據類型和類似的行數,它會掛起很長一段時間(目前爲30分鐘並計數)。對於這種差異有什麼可能的解釋?

編輯 - 使用EXPLAIN顯示所有查詢返回「不可能在讀取const表後WHERE注意到」的依賴子查詢。這可能是一個很好的時機,提到任何表格上都沒有索引(我繼承了...)。在應該是uniqid的列中找到重複的值,以便我可以將其轉換爲正確的主鍵是整個snape追捕的重點。

+0

不同的數據庫引擎(MyISAM數據VS InnoDB的或其他)不同的指標是首先想到的事情。 'EXPLAIN SELECT * ....'每個輸出是什麼? – Jakar

+2

你的表是不同的。 MySQL在相關的子查詢中感到不安,並且正在進行坐下罷工。誰知道 – Drew

+0

我不知道它是否會有所作爲,但你可以嘗試'SELECT * FROM table_name AS查詢JOIN(子查詢...)AS子查詢ON子查詢。列名LIKE query.column_name;' – Jakar

回答

0

我建議將子查詢拆分成臨時表。

CREATE TEMPORARY TABLE IF NOT EXISTS DupeColumn AS (
    SELECT column_name 
     FROM table_name 
     GROUP BY column_name 
     HAVING COUNT(*) > 1 
); 

SELECT t.* 
    FROM DupeColumn dc 
     INNER JOIN table_name t 
      ON dc.column_name = t.column_name; 

DROP TEMPORARY TABLE DupeColumn; 
0

根據我的經驗,MySQL是非常差的優化

SELECT * 
FROM table1 
WHERE col1 in (SELECT col2 FROM table2 WHERE ...) 

而不是執行一次子查詢,然後在table1查找所有col2值,它執行的table1,然後全面掃描在table2.col2中搜索col1

它確實更好,當你寫一個JOIN

SELECT table1.* 
FROM table1 
JOIN table2 ON table1.col1 = table2.col2 

在你的情況,這將使用子查詢做了table2

SELECT t1.* 
FROM table_name AS t1 
JOIN (SELECT column_name 
     FROM table_name 
     GROUP BY column_name 
     HAVING COUNT(*) > 1) AS t2 
ON t1.column_name = t2.column_name