2016-07-29 76 views
0

我在MySQL 5.7.13中有一個表,它有3列(實際上多於那個,但是這三個用於搜索) - 它有一列company_id,它有一列department_id,它有列status如何正確使用大型mysql表的索引?

現在,通常員工都是這樣工作的,他們進入系統,他們選擇與他們一起工作的公司,他們選擇部門(這是強制性的)。之後,他們進入菜單,並且可以從表中獲取數據而不指定狀態,或者他們也可以指定他們想要的狀態?

由於mysql索引的前綴順序,所以使用複雜索引(company_id,department_id,status)似乎很自然。由於他們總是按公司和部門進行篩選,有時候通過地位進行篩選,所以一切都很好。

但是,最近增加了一項新功能。還有一些特殊的員工,與普通用戶不同,他們只選擇公司,而不選擇部門。所以,他們的查詢按公司和狀態過濾。這就意味着索引被打破了,它只會被公司過濾,而不會被狀態過濾,因爲這個部門被省略了。

什麼是解決方法?我看到兩個解決方案。一個是狀態非常有限 - 它基本上爲值 - 創建(1),發送(2),接受(3),拒絕(4)。所以,我可以創造指數(COMPANY_ID,狀態,DEPARTMENT_ID),如果用戶不選擇任何地位,我可以在查詢像這樣追加:對於

AND status in (1,2,3,4) 

將索引的工作效率?或者,其他解決方案是創建第二個索引並同時具有(company_id,department_id,status)和(company_id,status,department_id),但是mysql優化器會選擇正確的索引嗎?我不確定,哪種方式更好,它們中的任何一種都會起作用。

+0

表中有多少行?一家公司的典型行數是多少?最大值是多少? 「公司+部門」只有一個「狀態」嗎? –

回答

0

從我可以看到,這應該工作正常。優化器將利用(x,y,z)組合上的索引,並在需要時執行using index; using where。請注意,假設我的理解是組合的最左側部分已經是where子句的一部分,如x允許y已經在索引使用中混合使用。

另一方面,如果IN子句甚至是巨大的,並且在單列索引上說,IN將快速滿足。看到我在這裏寫到的關於這個問題的答案:Index uses IN

當然,請看名爲EXPLAIN Syntax的MySQL手冊頁,以及類似Using EXPLAIN to Write Better MySQL Queries的內容。