2015-04-25 80 views
0

我們有很多這樣的問題,但每個查詢都是唯一的,所以這個問題出現了。我有以下查詢MySQL查詢優化,主鍵索引沒有使用?

Select * from tblretailerusers where (company_id=169 or company_id in (select id from tblretailercompany where multi_ret_id='169')) and (id in (Select contact_person_1 from tbllocations where status=1 and (retailer_comp_id=169 or retailer_comp_id in (select id from tblretailercompany where multi_ret_id='169'))) OR id in(Select contact_person_2 from tbllocations where status=1 and (retailer_comp_id=169 or retailer_comp_id in (select id from tblretailercompany where multi_ret_id='169')))) and (last_login is not null) 

它有三個表涉及零售商,他們的位置和他們的用戶。標準用戶信息。每個零售商可以有子零售商,所以零售商表具有父零售商ID。目前每個表都有大約6K條記錄,並且所有表的主鍵均爲自動增量,並且我知道它們也是索引的。在用戶表格電子郵件字段被編入索引。

現在,這個查詢需要1秒鐘,這是很好的,但現在客戶端希望找到其'電子郵件ID以特定字母開頭的用戶,如ab。只要我添加到查詢,它開始需要約50-60秒。我的電子郵件字段是不是唯一的創建索引,以及新的查詢看起來像

Select * from tblretailerusers where (company_id=169 or company_id in (select id from tblretailercompany where multi_ret_id='169')) and (id in (Select contact_person_1 from tbllocations where status=1 and (retailer_comp_id=169 or retailer_comp_id in (select id from tblretailercompany where multi_ret_id='169'))) OR  id in(Select contact_person_2 from tbllocations where status=1 and (retailer_comp_id=169 or retailer_comp_id in (select id from tblretailercompany where multi_ret_id='169')))) and (last_login is not null) and email REGEXP '^A|^B' 

我嘗試使用說明,在這兩個版本的查詢和有趣的事實,我注意到的是,在主表排它不顯示possible_key的任何值,因爲我們正在使用主鍵id在用戶表中搜索以及我也有電子郵件索引字段。下面是說明查詢:

enter image description here

我嘗試重新創建索引,目前我有比在用戶表的主鍵等一個指數使用ID,CompanyID和電子郵件指標。我也創建了公司表索引,但沒有任何加速。用戶表是MyISAM。

我的另一個問題是,如何跳過子公司搜索的子查詢,因爲您可以看到它在上面的查詢中使用了三次。

編輯:我在我的查詢中使用REGEXP的原因是當我嘗試Like 'A%'它甚至用這個選項很慢。

編輯我只是用last_login is null而不是last_login is not null進行測試,結果不到5秒鐘。不是空還是不空?

回答

0

而不是使用正則表達式的:

and email REGEXP '^A|^B' 

...嘗試一個簡單的,如:

and (email like 'A%' or email like 'B%') 

正則表達式是這個相當小的比較有點沉重。喜歡可能會更快。另外,我不希望優化器嘗試解碼正則表達式試圖執行的操作。但是,如果使用Like,它就會知道並可能會使用您設置的索引。

+0

對不起,我忘了提及''Like%''之後選擇'regexp'需要更多的時間工作。 –