我在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優化器會選擇正確的索引嗎?我不確定,哪種方式更好,它們中的任何一種都會起作用。
表中有多少行?一家公司的典型行數是多少?最大值是多少? 「公司+部門」只有一個「狀態」嗎? –