2011-11-16 4 views
1

나는 다음 쿼리 한 :그룹을 저장하고 값순으로 정렬하지 않고도이 쿼리를 빠르게 할 수 있습니까?

SELECT IF(dissolution_date IS NULL, 
      YEAR(CURDATE()) - YEAR(incorporation_date), 
      YEAR(dissolution_date) - YEAR(incorporation_date)) as length, 
    COUNT(DISTINCT(id_company)) as count 
FROM company 
WHERE incorporation_date IS NOT NULL 
GROUP BY length 
ORDER BY length ASC 

을 나는 용해 날짜 (또는 대체)가 점을 감안하고, 설립 날짜는이 차이를 저장하는 테이블에 추가 열을 추가 중복 보인다 두 개의 날짜 (특히 회사가 해체되지 않은 경우, 해산 날짜는 년마다 업데이트해야합니다.

id | select_type | table | type | possible_keys  | key | key_len | ref | rows | Extra 
----|-------------|---------|------|--------------------|------|---------|------|---------------------------------------- 
1 | SIMPLE  | company | ALL | incorporation_date | NULL | NULL | NULL | 9128995 | Using where; Using filesort 

을 현재 쿼리가 아닌 계산 된 열 비슷한 쿼리 내가 여기 달성하고 싶은 무엇 인 (밀리 초)을하는 반면, 초 10 년대를 취 다음과 같이

Explain 스 출력됩니다.

파일롯을 사용하지 않고 길이 테이블을 원래 테이블에 추가하지 않고 길이별로 그룹화하고 정렬 할 수 있습니까? 아니면 길이 열을 추가해야합니까?이 경우 년마다 해산 _ 날짜를 업데이트하는 가장 좋은 방법은 무엇입니까?

+0

죄송합니다. 오타되었습니다. – Jon

+1

'IF (...)'를 'YEAR (COALESCE (해산 날짜, CURDATE())) - YEAR (incorporation_date) AS 길이'로 바꾸는 것은 어떨까요 –

+0

헤드 업 : COALESCE에 감사드립니다. 차이점을 확인하십시오 : ( – Jon

답변

1

데이터베이스 이론에서 언급하는 것을 파생 된 속성이라고합니다. 그러한 속성을 구현하고 싶지는 않습니다. 비록 빨리 작동 할지라도 매우 정확하지 않기 때문입니다. 따라서 우리는 그러한 속성에 대한 열을 작성하지 않고 필요할 때 계산합니다.

파일 정렬은 필요 없으며 order by 절이 수행하는 작업입니다.

당신의 쿼리가 정확하다고 가정하면 검색 키 속성 (dissolution_date, incorporation_date)을 사용하여 회사 테이블에 B 트리 색인을 생성하는 것이 좋습니다.이 색인은 검색어에 많이 사용 된 것으로 보입니다.

회사 테이블 아이디어를 제공해 주시겠습니까?

+0

이것은 많은 쿼리를 빠르게 처리했습니다. ! – Jon

+0

그러나, 나는 Using Using where where; 색인 사용; 임시 사용; 내가'EXPLAIN' 질의를 할 때 filesort'를 사용합니다 ... (길이 4의) 새로운 키를 사용하지만 가능하다면 파일 정렬을 중지 시키려고합니다. – Jon

+0

또한 "가정이 정확한지" 부디? – Jon

관련 문제