2010-12-14 2 views
1

어떻게 mysql에서 타임 스탬프 열의 날짜 부분을 기준으로 그룹화하고 여전히 그 인덱스를 활용할 수 있습니까? 당신은 그러나이 쿼리 thetime에 인덱스를 사용할 수 없습니다타임 스탬프의 날짜순 그룹

select date(thetime) from mytable group by date(thetime) 

같은 솔루션을 사용할 수 있지만 당신이에 의해 그룹화하기 전에 기능을 사용하여 열을 변환하는로 대신 임시 테이블이 필요합니다 물론

그것.

+----+-------------+-------------+-------+---------------+-------------+---------+------+-------+----------------------------------------------+ 
| id | select_type | table  | type | possible_keys | key   | key_len | ref | rows | Extra          | 
+----+-------------+-------------+-------+---------------+-------------+---------+------+-------+----------------------------------------------+ 
| 1 | SIMPLE  | mytable  | index | NULL   | thetime  | 4  | NULL | 48183 | Using index; Using temporary; Using filesort | 
+----+-------------+-------------+-------+---------------+-------------+---------+------+-------+----------------------------------------------+ 

이론적으로 열의 인덱스에서 범위 스캔을 사용할 수없고 임시 테이블이 필요하지 않은 이유가 없습니다. 쿼리를 실행하도록 쿼리 최적화 프로그램을 설득 할 수있는 구문이 있습니까?

답변

1

데이터베이스에서 이미 원하는 것을 이해할 수 있습니다. xplan에서와 같이 인덱스가 (테이블 자체가 아닌) 스캔되고 있습니다.

그러나 그룹화 (고유) 작업 중 날짜를 저장하기 위해 중간 테이블이 필요하다는 사실을 잊을 수는 없습니다.

+0

함수를 사용하여 변경하지 않으면 인덱스 된 열에서 group by을 수행하기 위해 항상 임시 테이블이 필요하지는 않습니다. 작동하는 시간 부분을 잘라내는 함수 대신 연산자가 있다면 –

+0

@x : 음, 우리 둘 다 맞다고 생각합니다. 집계 함수가 적용되지 않는 한 별개의 값 목록은 비교를 위해 이전에 출력 된 값만 유지하면서 인덱스를 걷는 (이론적으로) 값을 얻을 수 있습니다. 카운트/합계를 수행 할 때 모든 값은 그룹화 작업이 끝날 때까지 유지되어야합니다. 질문은 : 이것은 데이터베이스에 구현되어 있습니까? :) – Ronnis

관련 문제