我們有很多這樣的問題,但每個查詢都是唯一的,所以這個問題出現了。我有以下查詢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以特定字母開頭的用戶,如a
和b
。只要我添加到查詢,它開始需要約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
在用戶表中搜索以及我也有電子郵件索引字段。下面是說明查詢:
我嘗試重新創建索引,目前我有比在用戶表的主鍵等一個指數使用ID,CompanyID和電子郵件指標。我也創建了公司表索引,但沒有任何加速。用戶表是MyISAM。
我的另一個問題是,如何跳過子公司搜索的子查詢,因爲您可以看到它在上面的查詢中使用了三次。
編輯:我在我的查詢中使用REGEXP的原因是當我嘗試Like 'A%'
它甚至用這個選項很慢。
編輯我只是用last_login is null
而不是last_login is not null
進行測試,結果不到5秒鐘。不是空還是不空?
對不起,我忘了提及''Like%''之後選擇'regexp'需要更多的時間工作。 –