2016-07-29 5 views
0

MySQL 5.7.13에 3 개의 열 (실제로는 그 이상이 있지만이 세 개는 검색에 사용됨)이있는 테이블이 있습니다.이 열은 company_id이고 열은 department_id이며 열은 status입니다.큰 mysql 테이블에 인덱스를 올바르게 사용하는 방법은 무엇입니까?

이제 직원들은 일반적으로 이와 같이 작업하고 시스템에 들어가며 함께 일하는 회사를 선택하고 부서를 선택합니다 (의무 사항 임). 그런 다음 메뉴로 이동하여 상태를 지정하지 않고 테이블에서 데이터를 가져 오거나 원하는 상태를 지정할 수 있습니다.

mysql 인덱스의 접두사 순서로 인해 복잡한 인덱스 (company_id, department_id, status)를 사용하는 것이 자연스러운 것처럼 보였습니다. 그들은 항상 회사와 부서별로 그리고 때로는 상태별로 필터링하기 때문에 모든 것이 잘 보였다.

그러나 최근에는 새로운 기능이 추가되었습니다. 또한 일반 사용자와 달리 회사 만 선택하고 부서는 선택하지 않는 특수 직원이 있습니다. 따라서 쿼리는 회사 및 상태별로 필터링됩니다. 즉, 색인이 끊어지면 부서가 생략되어 상태가 아닌 회사별로 필터링합니다.

이 문제를 해결할 수있는 방법은 무엇입니까? 여기에 두 가지 해결책이 있습니다. 하나는 상태가 매우 제한적이라는 것입니다. 기본적으로 CREATE (1), SENT (2), ACCEPTED (3), REJECTED (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을 수행합니다. 복합 요소의 맨 왼쪽 부분이 x과 같이 이미 where 절에 포함되어 있으므로 y이 이미 색인 용으로 사용되도록 허용하고 있다는 것을 알고 있다고 가정합니다.

또 다른 참고로, IN 절이 거대하고 단일 열 인덱스에서 말하는 경우에 IN이 신속하게 만족 될 것입니다. 내가 여기에 쓴 대답은 Index uses IN이다.

물론, EXPLAIN Syntax이라는 MySQL 매뉴얼 페이지와 Using EXPLAIN to Write Better MySQL Queries과 같은 것을 찾아보십시오.