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 최적화 프로그램이 올바른 인덱스를 선택합니까? 나는 확실하지 않다. 어느 쪽이 더 낫다. 그리고 그들 중 누구라도 일할 것이다.
테이블의 행 수는 얼마입니까? 한 회사의 일반적인 행 수는 얼마입니까? 최대는 무엇입니까? '회사 + 부서'에 대한 '상태'는 하나뿐입니까? –