2012-07-20 2 views
0

나는이은 where 절에 대한 인덱스가있는 distinct (count (ColumnName))에 필요한 인덱스입니까? <code>OwnedBy</code> 컬럼에 인덱스가 있습니다</p> <pre><code>SELECT COUNT(DISTINCT(EmailAddress)) FROM Subscribers WHERE Subscribers.OwnedBy = 67; </code></pre> <p>:이 같은 쿼리 경우

Subscribers 
    Id (PK, int) 
    OwnedBy (FK, int) 
    EmailAddress (varchar 50) 

같은 테이블이 있습니다. 테이블이 매우 크다고 가정하면 EmailAddress을 사용해야합니까? 쓰기 성능 저하에 대해 걱정하지 않습니다.

답변

1

. 쿼리는 다음과 같이 다시 쓸 수 있기 때문에

은 : 당신은 MySQL의 GROUP BY 성능 최적화 페이지를 살펴해야

SELECT COUNT(*) 
FROM Subscribers 
WHERE Subscribers.OwnedBy = 67 
GROUP BY EmailAddress 

:이

http://dev.mysql.com/doc/refman/5.0/en/group-by-optimization.html

를, 다음이 적혀있다 :

The most efficient way to process GROUP BY is when an index is used to 
directly retrieve the grouping columns 

so 테이블의 삽입/업데이트 성능 및 크기에 대해 걱정하지 않으시는 경우 반드시 색인을 가지고 가야합니다. EmailAddress

+0

감사합니다. Omesh가 언급 한 커버 링 인덱스를 작성하는 대신 솔루션에 대해 의견을 제시 할 수 있습니까? – Harper

+0

아마도 도움이 될 것입니다. http://stackoverflow.com/questions/8213235/mysql-covering-vs-composite-vs-column-index – Horen

1

더욱 빠르게 만들기 위해 커버 인덱스를 만들어야합니다. 이 쿼리와 인덱스를 사용하는 경우 사용 등

ALTER TABLE Subscribers ADD KET ix1(OwnedBy, EmailAddress); 

확인 상태 : 네 당신이해야

EXPLAIN SELECT COUNT(DISTINCT(EmailAddress)) 
FROM Subscribers 
WHERE Subscribers.OwnedBy = 67;