2017-02-22 127 views
-1

我有以下的MySQL查詢,它將需要超過421ms我該如何優化?如何提高此查詢的性能?

SELECT j.*, c.cl_business_name, c.cl_short_name, 
     m.me_last_name, m.me_first_name, o.co_name, j.jo_deleted_date 
FROM clients c, companies o, jobs j 
LEFT JOIN members m ON j.me_id = m.me_id 
WHERE ? AND j.jo_deleted = ? AND j.co_id = o.co_id AND j.cl_id = c.cl_id 
ORDER BY jo_deleted_date DESC 
+1

您是否創建了索引? – Rahi

+1

爲一百萬行421毫秒是不錯的。儘管你可以展示你的餐桌設計和解釋計劃。 –

+1

1.請提供完整的查詢以替換。還請提供該查詢的解釋結果。 3.還提供索引列表以及您在查詢中的表格上定義的列名稱。你確定不到半秒的運行時間是不好的? – Shadow

回答

-1

你需要一個條件爲你的連接(默認mysql使用內連接)在這個位置。這些公司和客戶之間沒有關係。應該是這樣的:「INNER JOIN公司o ON o.id = c.companiesId」。

要加快查詢速度,請從較小的表中的最大值加入。

我只能猜測這個關係是什麼樣子,但是這個查詢應該可以幫助你完成。

我可以想象,這是原因,對於這個響應時間!

SELECT 
    j.*, 
    c.cl_business_name, 
    c.cl_short_name, 
    m.me_last_name, 
    m.me_first_name, 
    o.co_name 
    [, j.jo_deleted_date -> can be ignored, is already in j.* included] 
FROM clients c 
INNER JOIN jobs j ON j.cl_id = c.cl_id AND j.jo_deleted = ? 
INNER JOIN companies o ON j.co_id = o.co_id 
LEFT JOIN members m ON j.me_id = m.me_id 
WHERE ? 
ORDER BY jo_deleted_date DESC 
+0

你的查詢有語法錯誤.. –

+1

我同意顯式連接語法比隱式更好,但是,就查詢性能而言,幾乎沒有任何區別。當存在差異時,通常是由於不瞭解顯式連接在from子句中逗號運算符的優先級。公司和客戶之間不必有直接的關係,它們通過工作表鏈接在一起。 – Shadow