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


137

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

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

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

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


무엇입니까 field 20?
AlikElzin-kilaka

답변:


164

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 절에 사용되는 열)이 색인화되어 있는지 확인하고 싶습니다.


3
설명 감사합니다. 정말 도움이됩니다. 더 많은 필터를 갖게 될 것입니다. 날짜 시간이 중복되어 색인 작성 날짜 시간 필드가 좋은지 아닌지 확인하고 싶습니다. 그러나 당신은 그것을 설명했다 :) 감사합니다
Jaylen

4
'join 및 where 절에 사용 된 항목'에 +1 인덱싱 전략을위한 훌륭한 경험 법칙.
분명히

1
그러나 "2017-01-01 11:20"에서 "2018-01-03 12:12"와 같은 데이터 범위와 같은 날짜 범위 의 데이터를 쿼리하면 열을 SELECT색인화하더라도 쿼리가 더 빨라 지지 않습니다 date time. .. equal작업을 사용할 때 인덱스가 빠르게 쿼리됩니다 .
user3595632

1
DAY (datetime) 또는 HOUR (datetime)과 같은 시간 함수를 사용하여 datetime 필드를 쿼리하면 어떨까요? 이 경우 색인이 도움이되거나 방해됩니까?
cronoklee

안녕하세요 @Explosion Pills, 연도 및 월에 테이블베이스 만 쿼리 해야하는 경우 연도 및 월만 사용하여 새 열을 만든 다음 날짜 시간 열의 색인을 직접 생성하는 대신 색인을 생성하면 더 나은 성능을 얻을 수 있습니까 ? 그와 같이 저는 201801과 같은 열을 만듭니다.
Woods Chen

18

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


감사합니다. 나는 그것을 옵션으로 생각하고 있었지만 접근 방법을 몰랐습니다. 나는 당신이 절대적으로 올바른 정수라고 생각합니다. 항상 빠릅니다.
Jaylen

62
보다 나은? 유닉스 타임 스탬프가 모든 경우에 더 나은지 의심 됩니다. 예, 정수를 저장하는 것이 일반적으로 문자열을 저장하는 것보다 빠르지 만 MySQL이 제공 하는 모든 DateTime 함수 는 어떻습니까? 직접 구현하면 성능이나 기능에 부정적인 영향을 미칩니다.
Greg Greg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.