[mysql] mysql에서 datetime 필드를 색인화하는 것이 좋습니다?

큰 데이터베이스를 디자인하고 있습니다. 내 응용 프로그램에는 많은 행이 있습니다. 예를 들어 현재 4 백만 개의 레코드가있는 하나의 테이블이 있습니다. 내 쿼리의 대부분은 datetime 절을 사용하여 데이터를 선택합니다. mysql 데이터베이스에서 날짜 시간 필드를 색인화하는 것이 좋습니다?

Select field1, field2,.....,field15
from table where field 20 between now() and now + 30 days 

데이터베이스가 제대로 작동하고 쿼리가 원활하게 실행되도록 노력하고 있습니다

더 고효율 데이터베이스를 만들어야한다고 생각하는 아이디어는 무엇입니까?



답변

MySQL은 조건 사이의 행 제거를 포함하여 다양한 이유로 인덱스를 사용하는 것이 좋습니다. http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

따라서 쿼리에서 자주 사용하는 경우 날짜 시간 열을 인덱스의 훌륭한 후보로 사용할 수 있습니다. 유일한 조건이 BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY)있고 조건에 다른 인덱스가없는 경우 MySQL은 모든 쿼리에서 전체 테이블 스캔 을 수행해야 합니다. 30 일 동안 몇 개의 행이 생성되는지 확실하지 않지만 전체 행의 약 1/3보다 작 으면 열에서 인덱스를 사용하는 것이 더 효율적입니다.

효율적인 데이터베이스 생성에 대한 귀하의 질문은 매우 광범위합니다. 나는 그것이 정규화되고 모든 적절한 열 (즉, 조인 및 where 절에 사용되는 열)이 색인화되어 있는지 확인하고 싶습니다.


답변

여기서 저자는 테스트 결과 정수 유닉스 타임 스탬프가 DateTime보다 낫다는 것을 보여주었습니다. 그는 MySql을 사용했습니다. 그러나 정수를 비교하는 데 사용하는 DB 엔진이 날짜를 비교하는 것보다 약간 빠르므로 int 인덱스가 DateTime 인덱스보다 낫습니다. T1-두 날짜 비교 시간, T2-두 정수 비교 시간을 취하십시오. 일부 균형 잡힌 트리를 기반으로 한 인덱스 때문에 인덱싱 된 필드를 검색하는 데 약 O (log (rows)) 시간이 걸립니다. DB 엔진마다 다를 수 있지만 어쨌든 Log (rows)는 일반적인 추정치입니다. (비트 마스크 또는 r- 트리 기반 인덱스를 사용하지 않는 경우). 차이점은 (T2-T1) * Log (rows)입니다. 자주 쿼리를 수행하면 역할을 수행 할 수 있습니다.


답변