2012-02-20 2 views
1

테이블에 200 만 개가 넘는 레코드가 있습니다.더 많은 필드를 인덱싱하지 않고 카운트 성능을 향상시키는 방법은 무엇입니까?

테이블에 몇 개의 오류 (체크 표시)가 있는지, 얼마나 많은 오류가 있는지 확인하고 싶습니다.

SELECT count(*) as Checked FROM table WHERE checked = 1 

성능은 정말 느리다, 그것은 결과를 얻기 위해 약 5 분 소요 -

SELECT count(*) as CountError FROM table WHERE checked = 1 AND error != '' 

:

나는 두 개의 쿼리를 수행. 어떻게 개선할까요?

나는 이미 업데이트 성능을 위해 status 필드에 색인을 가지고 있습니다.

checked 필드에서 색인을 생성하면 그다지 좋지 않은 업데이트 성능이 적용됩니다.

UPDATE가 SELECT 이상 발생합니다.

는 Innob

있습니다
+3

더 많은 하드웨어 구매. 아니, 정말로 - 당신은 무언가를 얻을 수 없으므로, 트레이드 오프를하지 않으려는 경우 문제의 제약 조건을 변경해야합니다. 'memcache' 또는 더 빠른 머신을 사용하거나 데이터베이스 소프트웨어를 업그레이드하십시오. – Borealid

+1

이것은 매우 기본적인 쿼리입니다. 'checked' 또는'error'에 대한 색인을 생성하지 않고 할 수있는 일은 없습니다. @Borealid 하드웨어 만 구입하면됩니다. –

+0

인덱스를 추가하지 않고 리소스를 절약하는 것이 인덱스 추가의 리소스 비용보다 큰 경우 인덱스를 추가하십시오. 일반적으로 비용보다 인덱스를 추가하면 더 많은 이점이 있다는 것을 알게 될 것입니다. 전반적인 저축이 없다는 것을 계량화 할 수 없다면, 나는 업데이트에 대한 영향에 지나치게 '걱정'하기보다는 필요한 것을 추가하는 편에서 일반적으로 오류를 범할 것입니다. – MatBailie

답변

3

는 빠른 :

select 
    count(*) as CountError, 
    sum(case when error != '' then 1 else 0 end) as Checked 
from table 
where checked = 1 

그러나 차이는 아마에 대해 얘기를 많이하지 않습니다. 차이를 실제로 원한다면 색인을 추가해야합니다. 그 충격이 실제로 무엇을 의미하는지 생각해보고, 그 충격이 실제로 될 수있는 것에 대한 느낌을 얻기위한 실제 테스트를하십시오. 업데이트가 10 % 느려지고 select가 100000 % 빨라지면 여전히 가치가있을 것입니다.

+0

제가 아는 한, 두 번째 집계는 더 간단 할 수 있습니다 MySQL에서는 :'SUM (error! = '') AS Checked' (boolean은 암시 적으로 정수로 변환된다.이 경우'false' ->'0','true' ->'1'). –

0

여기에 귀하의 문제는 위탁 필드 것을 단순히 하나 MySQL은 테이블이 효율적 곳을 결정 할 수 없습니다입니다 당신이 키가 비록 스캔 할 필요가 있다는 것을 의미 1 또는 0 0과 1 사이의 분리는 특히 많은 양의 행에 있습니다.

내가 제공 할 주요 권고 사항은 원하지 않는 색인입니다. 그러면 SELECT SUM(checked) AS Checked FROM table WHERE checked=1과 같이 색인을 작성하여 색인을 사용하여 색인을 사용할 수 있습니다.

궁극적으로 그래도 간단한 쿼리는 아닙니다. 카운트를 보관하는 몇 가지 방법을 살펴볼 수 있습니다. 날짜 또는 시간 소인이있는 경우 전날의 수 (*)를 저장할 수있는 일을 매일 설정할 수 있습니다. 차례 차례로 해석 할 행 수가 줄어 듭니다.

이 표의 정확한 목적에 대한 추가 정보가 없으면 위 열 + 기타 등등에 색인을 허용하지 않는 이유 때문에 위의 + 하드웨어보다 더 유용한 정보를 제안하기가 어렵습니다. 같은 쿼리에서 두 수를 만드는 경우 시도 할 수

+0

예, 인덱스가 충분하지 않으면 인덱스가 쓸모가 없습니다. –

+0

제한된 사용이 가능하지만 제한된 열이 필요한 인스턴스에서 인덱스를 사용할 수 있다는 관점에서만 가능합니다. 하지만 대부분의 목적을 위해 더 큰 범위 즉, 날짜 범위 인 –

+0

이있는 인덱스와 비교할 때 거의 개선되지 않습니다. 덮고있는 인덱스에 대한 인덱스 스캔은 테이블 스캔보다 효율적입니다. –

관련 문제