2014-02-20 150 views
0

我有一個左連接:MySQL的左連接很慢

$query = "SELECT a.`id`, a.`documenttitle`, a.`committee`, a.`issuedate`, b.`tagname` 
    FROM `#__document_management_documents` AS a 
    LEFT JOIN `#__document_managment_tags` AS b 
    ON a.id = b.documentid 
    ".$tagexplode." 
    ".$issueDateText." 
    AND a.committee in (".$committeeQueryTextExplode.") 
    AND a.documenttitle LIKE '".$documentNameFilter."%' 
    GROUP BY a.id ORDER BY a.documenttitle ASC 

    "; 

這真是慢abaout7秒在4000個記錄

任何想法我可能是做錯了

SELECT a.`id`, a.`documenttitle`, a.`committee`, a.`issuedate`, b.`tagname` 
FROM `w4c_document_management_documents` AS a 
LEFT JOIN `document_managment_tags` AS b 
ON a.id = b.documentid WHERE a.issuedate >= '' 
AND a.committee in ('1','8','9','10','11','12','13','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36','37','38','39','40','41','42','43','44','45','46','47') 
AND a.documenttitle LIKE '%' GROUP BY a.id ORDER BY a.documenttitle ASC 
+1

可以在插入PHP值後顯示查詢嗎? –

+0

如果您在表a中有很多記錄,它可能是where子句中的運算符放慢了速度。考慮使用全文索引並匹配(...)() – markg

+0

您可以執行並顯示以下結果:'SHOW INDEX FROM __document_management_documents; SHOW INDEX FROM __document_managment_tags;' – kmas

回答

0

我會在a.committee上放一個索引,全文索引在doctitle col上。 IN和LIKE是我的直接標誌。發行日期也應該有一個指標,因爲你是> =它

0

嘗試在MySQL客戶端運行以下命令:

show index from #__document_management_documents; 
show index from #_document_management_tags; 

檢查,看是否有鍵/從iddocumentid領域指標各自的表格。如果沒有,MySQL將進行全表掃描來查找值。在這些字段上創建索引使搜索時間成爲對數,因爲它將它們排序存儲在索引文件中的二叉樹中。更好的辦法是使用主鍵(如果可能的話),因爲這樣行數據就存儲在葉中,從而節省了MySQL的另一個I/O操作來查找數據。

也可能只是IN和> =運算符的性能很差,在這種情況下,您可能需要重新編寫查詢或重新設計表格。

0

如上所述,嘗試查找您的列是否有索引。您甚至可以在查詢開始時在您的MySQL客戶端執行「EXPLAIN」命令,查看查詢是否實際使用索引。您將在「關鍵」欄和「額外」欄中看到。獲取更多信息here

這將幫助您優化您的查詢。另外按原因使用臨時和filesort,這會導致MySQL創建一個臨時表並遍歷每一行。如果你可以使用PHP來分組將會更快。