2013-08-04 2 views
2

많은 인덱스처럼 보이는 테이블을 사용하고 있습니다. 사실 8 개입니다. 그 그 세 가지 키 조합의 중복을 방지하기 때문에데이터베이스 및 다중 열 인덱스 (mySQL)

type  columns 
----- ------------------------------ 
index project_id 
unique project_id, user_id, event_id 
index project_id, user_id, type, subtype 

이제 내가 아는 것과, 고유 한 필요하며, 우리가 필요합니다 그러나 그들 중 일부는 예를 들어, 여기에 이러한 인덱스의 약간의 중복 보인다 그. 그러나 첫 번째 색인은 불필요하지 않습니까?

빠른 select * from activities where project_id = 5579을 수행했으며 4 개의 열이있는 인덱스를 사용했습니다 (Explain 기반). 다른 쿼리를 사용하여 project_id를 변경하기 만하면 고유 인덱스가 사용되었습니다. 첫 번째 색인이 여전히 사용되는 상황이 있습니까 아니면 안전하게 제거 할 수 있습니까?

이 상황은 user_id 열에 대해서도 마찬가지입니다.이 열은 그 자체로 색인화 된 다음 첫 번째 열의 다중 열 색인을 갖습니다.

필자의 생각은 인덱스가 더 느리다 = 삽입이 더 느리다. 그래서 불필요한 것들을 제거해야한다고 생각한다.

+0

느린 인서트로 인해 고통받는 테이블이 있습니까? 아무것도 깨뜨린 건가요? 여기서 문제는 느린 실행 쿼리에 대해 이러한 인덱스가 작성되었을 수 있으며이를 제거하여 또 다른 문제점을 생성한다는 것입니다. 그것을 고치지 않았다면 그것을 고쳐라. – Namphibian

+0

@ am 피 비안 테이블에 약 30 개의 삽입물이 있으므로 테이블을 더 잘 만드는 것이 좋습니다. 첫 번째 색인을 제거하면 두 번째 색인과 세 번째 색인으로 인해 쿼리에 영향을주지 않는 쿼리에 영향을 미치지 않지만 필자는 더 많은 것을 알고있는 사람으로부터 그 인덱스를 확인하려고합니다. – Will

+0

당신의 생각은 맞습니다. 우리는 모든 지표를 볼 수 있을까요? 아마도 색인이 끝났을 것입니다. 이 테이블에 대해 발행 된 모든 쿼리를 식별 할 수 있습니까? – Namphibian

답변

0

색인 project_id, user_id, type, subtype은 WHERE 또는 GROUP BY가 단지 project_id만을 지정하는 경우를 다룹니다.

0

복합 색인에 유의해야 할 주요 사항 중 하나는 색인에 나열된 필드의 순서가 중요하다는 것입니다.

project_id가 GROUP BY, ORDER BY 또는 가입 조건 또는 project_iduser_id이있는 곳에서 사용됩니다

그래서 색인 project_id, user_id, event_id 당신은 다음의 조건 중 하나가 충족되는 경우이 인덱스를 사용할 수 있습니다 GROUP BY, ORDER BY 또는 가입 조건 또는 project_idevent_id AS user_id 당신이 피곤 user_id를 사용하는 경우 WHERE, GROUP BY, ORDER BY 또는 가입 조건

에 사용되는 경우에 사용 또는 event_id이면 색인이 사용되지 않습니다. user_idevent_id을 사용하려고하면 색인이 사용되지 않습니다. project_idevent_id을 사용하려고하면 색인이 사용되지 않습니다.

index_id 색인이 필요하지 않으므로 여기에 index_id을 (를) 사용하려고합니다.

물론 인덱스가 필요한 인덱스와 필요하지 않은 인덱스를 이해하기 위해 테이블을 쿼리 할 수있는 모든 가능한 방법을 완전히 이해해야합니다.

관련 문제