2010-11-20 2 views
8

이 내 기본 날짜 - 시간 구조 :MySQL에서 날짜 시간 검색을 최적화하는 방법은 무엇입니까?

primary key(datetime)   key 
auot_id date_time    user_id 
1  2010-10-01 20:32:34 1 
2  2010-10-02 20:32:34 1 
3  2010-11-03 20:32:34 2 
4  2010-10-04 20:32:34 1 
5  2010-11-05 20:32:34 1 

그리고 '2010-10'에서 day(date_time)의 결과를 얻을 대상과 user_id = '1'; 내 SQL은 다음과 같습니다

SELECT * FROM datetime WHERE user_id = 1 AND DATE_FORMAT(date,'%Y-%m') = '2010-10' 

하지만 EXPLAIN 코드 표시 :

SIMPLE datetime ALL (NULL) (NULL) (NULL) (NULL) 5 Using where 

그래서이 코드 줄은 보이지 않습니다. 매우 효과적으로 수행 할 수 있습니다. 검색을보다 효과적으로 만들기 위해 어떻게 테이블을 구성 할 수 있습니까?

대단히 감사합니다!

답변

12

WHERE 절에서 열의 함수를 사용하면 해당 열의 인덱스를 효율적으로 사용할 수 없습니다. 대신 다음을 시도하십시오 :

SELECT * 
FROM `datetime` 
WHERE user_id = 1 
AND `date` >= '2010-10-01' AND `date` < '2010-11-01' 

(user_id, date)에 대한 색인을 추가하십시오.

+1

저는 mysql을 처음 사용합니다. 따라서 어떤 종류의 색인을 추가해야하는지 잘 모르겠습니다. 나는 그들에 인덱스를 만들었다 고 생각한다 : INDEX'date' ('date','user_id') – qinHaiXiang

+0

'date'가 함수에 전달되기 때문에'user_id'는 "정적"값이므로 다른 방식으로 사용하고 싶습니다. . – Danosaure

+0

https://dba.stackexchange.com/a/140693/39319를 참조하십시오. 자정 거래에 대한 우려가있는 경우 사용자가 모든 날짜 및 시간을 처리하는 방법을 더 잘 설명합니다. –

2
SELECT * 
FROM yourTable 
WHERE datatime 
BETWEEN '2010-10-01' AND '2010-11-01' 

효율적이며 색인 생성도 허용합니다.

0

방법에 대해 :

WHERE CAST(datatime AS DATE) = '2010-10-01' 

아니면

WHERE CAST(datatime AS DATE) = CAST('2010-10-01' AS DATE) 

가 너무 비효율적이 될 것인가?

+1

이것은 DATE (datatime)와 동일합니다. effect는 인덱스를 무효로합니다. –

관련 문제