2012-10-05 79 views
0

我有這樣的MySQL查詢,這是非常慢的,我因爲所有的JOIN的設定(它看起來很複雜,但它的很多表的問題):改善本很慢的MySQL SELECT

SELECT DISTINCT doctors.doc_id, 
    doctors.doc_user, 
    doctors.doc_first, 
    doctors.doc_last, 
    doctors.doc_email, 
    doctors.doc_notes, 
    titles.tit_name, 
    specializations.spe_name, 
    activities.act_name, 
    users.use_first, 
    users.use_last, 
    (SELECT COUNT(*) FROM locations WHERE locations.loc_doctor = doctors.doc_id) AS loc_count, 
    (SELECT COUNT(*) FROM reception WHERE reception.rec_doctor = doctors.doc_id) AS rec_count, 
    (SELECT COUNT(*) FROM visits INNER JOIN reports ON visits.vis_report = reports.rep_id WHERE visits.vis_doctor = doctors.doc_id AND reports.rep_user LIKE '%s') AS vis_count 
FROM 
    doctors 
INNER JOIN titles ON titles.tit_id = doctors.doc_title 
INNER JOIN specializations ON specializations.spe_id = doctors.doc_specialization 
INNER JOIN activities ON activities.act_id = doctors.doc_activity 
LEFT JOIN locations ON locations.loc_doctor = doctors.doc_id 
INNER JOIN users ON doctors.doc_user = users.use_id 
WHERE 
    ((doctors.doc_last LIKE %s) OR (doctors.doc_first LIKE %s) OR (doctors.doc_email LIKE %s)) 
    AND doctors.doc_user LIKE %s 
    AND locations.loc_province LIKE %s 
    AND doctors.doc_specialization LIKE %s 
    AND doctors.doc_activity LIKE %s 
ORDER BY %s 

所有%s是sprintf()中的參數PHP函數
要注意的最重要的事情是......我沒有MySQL上的索引!我認爲我可以加快這個過程,增加一些索引......但是什麼和在哪裏?有這麼多的連接和搜索參數,我很困惑會有什麼效率:-)

請你幫忙嗎? 在此先感謝!

+0

可以執行後的計劃? 'EXPLAIN查詢' –

回答

0

您可以從在where條件中使用的列上添加索引開始。

此外,您應該索引連接中使用的字段,即主鍵和外鍵列。

我建議逐步試驗這些指標會產生真正的性能提升。

此外,我觀察到您在單個查詢中獲取太多數據。如果真的不需要,就將其分解成不同的報告和頁面(如果可能的話),因爲即使您進行了適當的索引編制,解決方案也不具有可擴展性,並且可能無法處理大量數據。

注意:您可能必須創建在其上的「%」預選賽查詢字段的全文索引(即使用LIKE運算符)