2012-06-13 95 views
0

任何關於如何讓這個查詢運行得更快的建議?mysql速度問題

SELECT *, p.* 
FROM grouped g 
INNER JOIN form p 
on p.id = g.id 

LEFT JOIN prospect ps 
ON (p.appphone = phone_bus OR p.appphone = phone_res OR p.appphone = phone_fax) AND p.appphone != '' 
WHERE p.agname like '%test%' 
ORDER BY p.agname DESC 
limit 0, 100 

如果我將ON改爲不使用OR,它會很快運行。像這樣需要30-40秒。

p.appphone,phone_bus,phone_res,phone_fax和p.agname都在表中編入索引。

+0

您查詢的表中有多少行? –

+0

@brian 80,000 p,60,000 ps和80,000 g – user583576

+0

謝謝。這個數據庫在哪裏託管? –

回答

0

你正在做一個內部連接,如果索引正確,該連接應該會很快,匹配'%test%'上的左連接可能是花費時間的地方。

它正在經歷您的最大60k行(您正在選擇所有列),並且當它到達字段agname時,它必須遍歷字符串以匹配字符串中某處的單詞測試60,000次。我想說優化「%測試%」,如果有noway解決這個...你可以

appphone - 有多少種不同的場景在那裏 -

ON (**p.appphone = phone_bus OR p.appphone = phone_res OR p.appphone = phone_fax**) AND p.appphone != '' 

你可以加入的關鍵,和然後在WHERE子句中使用嵌套的OR語句,否?

也許你可以說p.appphone <> phone_print或其他東西將包括此嵌套OR語句,但優化它,以便它只是尋找它不是什麼,而不是它可能是三個不同的實例....也真的p.appphone =''或它是空的?不確定到底有多快,但你可以說前面提到的左連接中p.appphone不爲空。

+0

如果我在快速運行的ON語句中刪除OR。我需要在ON上搜索所有這些情況。 – user583576

+0

然後不幸的是,我認爲這將需要一段時間,除非你創建一個表來容納內的結果加入,然後離開加盟上,否則它是MySQL後臺大量的工作。你是否只嘗試過在agname和appphone上建立索引? – Hituptony

0

我想嘗試:

  1. 使用ANY操作;
  2. p.appphonne != ''轉換爲WHERE條款;
  3. 精確SELECT列表,'cos *已包含p.*字段。

請嘗試此查詢:

SELECT *, p.* 
    FROM grouped g 
    JOIN form p ON p.id = g.id 
    LEFT JOIN prospect ps 
    ON p.appphone = ANY(ps.phone_bus, ps.phone_res, ps.phone_fax) 
WHERE p.agname LIKE '%test%' 
    AND p.appphone != '' 
ORDER BY p.agname DESC 
LIMIT 0, 100; 

請在您的第一條消息EXPLAIN輸出的查詢。