2012-01-03 40 views
1

我有一個表,其中有近2,000,000記錄。 我有一個列(crmid),它是該表中的一個varchar。 我寫了一個查詢 說,需要微調我的mysql查詢有一個索引varchar列

Select column1, column2,..... from table where crmid = ? 

的價值來自前端。以前它工作正常,但現在它從前端得到超時。 然後我在那個專欄上使用了一個索引,這對我來說幫助不大。 索引編制之後,我解釋了查詢,它又遍歷180萬行也使用索引。

請幫我調整此查詢。

注意:這不是實際的查詢,它只是最簡單的形式。實際查詢中有許多連接。

EDITED :: 完整查詢

select column1 
     , column2 
from table1 a 
     inner join appointmentstatusmst st 
      on st.entity_id = a.shdstatuslviid 
     inner join hlcclientdetails 
      on a.shdclientid = hlcclientdetails.cldregno 
      and a.shdclientdcnid = hlcclientdetails.clddcnid 
where hlcclientdetails.cldunifiedcrmid = ? 

解釋輸出爲

+0

如果還有另一種調整此查詢的方法,即使使用索引也不受歡迎。 – 2012-01-03 12:11:09

+3

發佈整個查詢,或者至少確切地說明如何使用where子句中的'crmid'列。順便說一句,200萬行被認爲是「小到中等」大小的表 – Bohemian 2012-01-03 12:16:32

+0

請發表您的查詢。其他方面不可能準確找到。 – 2012-01-03 12:18:50

回答

3

是否有appointmentstatusmst.entityid的指數? table1.shdclientidtable1.shdclientdcnid怎麼樣?如何在hlcclientdetails.cldregnohlcclientdetails.clddcnid

爲了讓您的連接順利進行,您需要在連接標準所涉及的列上以及在用於選擇輸出行的列上使用索引。

@波希米亞語是正確的,這是一箇中等大小的問題。

編輯。

這可能有助於思考你的mySQL服務器實際上必須做什麼來執行你的查詢。

where hlcclientdetails.cldunifiedcrmid = ? 

表示它必須通過hlcclientdetails表尋找某些行。所以cldunifiedcrmid上的索引可以讓它有效地做到這一點。你提到你有這個索引。好。

移動的,

inner join hlcclientdetails 
       on a.shdclientid = hlcclientdetails.cldregno 
      and a.shdclientdcnid = hlcclientdetails.clddcnid 

意味着它必須把它在你的hlcclientdetails表中找到行和通過觀察a.shdclientdcnida.shdclientid將其與您table1 a。因此,您的查詢可能會從這兩列的table1 a中的複合索引中受益。您應該嘗試添加該索引,並查看性能是否會變好。

最後,

inner join appointmentstatusmst st 
      on st.entity_id = a.shdstatuslviid 

意味着服務器必須把它在table1 a發現行並匹配起來這第三個表。你在你的評論中提到entity_id是該表的PK。這將有所幫助。

你明白了,我希望。索引不僅對WHERE子句有幫助,對ON子句也有幫助。

順便說一句,在另一個答案中提到的全文索引不會幫助您遇到此JOIN性能問題。

+0

entity_id是該表的主鍵 – 2012-01-03 13:25:39

+1

作爲一條經驗法則,幾乎所有的foriegn鍵都需要索引,因爲它們幾乎總是用在連接中。我知道在SQl服務器中它們不是自動創建的,我會懷疑它們不在我的sql中。我對你使用「romp」這個詞有所瞭解。 – HLGEM 2012-01-03 23:25:27