database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 28037 게시물 읽기
No. 28037
인덱스설정관련하여 날짜 타입 선정에 대해 조언부탁드립니다.
작성자
이왕태(wangtae)
작성일
2009-02-17 20:32
조회수
5,262

데이타가 한달에 100만건 이상 생성되는 테이블이 있습니다. (경우에 따라 1000만건 이상일수도 있음)

 

날짜필드는 date 타입을 사용하며 특정달의 데이터를 자주 구합니다.

 

다음은 쿼리의 예입니다.

 

SELECT * FROM Class WHERE date BETWEEN '2009-02-01' AND '2009-02-28'

 

과 같은 형식으로 쿼리가 가능한데요..

 

인덱스설정시 BETWEEN 보다는 = 로 설정하는게 더 효율적이라고 책에 적혀 있더군요..

 

그럼 위와 같은 쿼리가 대부분을 차지할 경우에는

 

date 필드는 year, month, day의 char형으로 분리한 후

 

SELECT FROM Class WHERE year='2009' AND month='02'

 

이런식으로 사용하는것이 더 효율적인가요?

 

인덱스는 year, month에 걸어두고요..

 

많은 조언 부탁드려요.

 

 

이 글에 대한 댓글이 총 1건 있습니다.

저라면 테이블을 아예 분리해버리기도 합니다. 특정 기준( 일, 월,주 단위 등으로 )

날짜 단위로만 보는 경우에는 가장 좋더군요. 물론 달별 로그 보려면 무식하게 union 해야 하는 문제가 있습니다.

-----------------------------------------------
이제부터는 사견인데요, MySQL 내부 로직은 제가 알 수 없지만, 일반적인 개발자라면 DATETIME을 관리하는데 2가지를 놓고 따지게 됩니다. 이종 플랫폼/OS 간 데이터를 편하게 유지하는 목적으로 DATETIME을 string형태로 저장하기도 하고, 적은 저장공간과 비교의 편의를 위해 time_t 혹은 time64_t 등을 사용해서 저장하기도 합니다.

 time_t 등의 basic type으로 저장한 경우에는 cpu에서 1 cycle만에 비교할 수 있을테고, string들은 strcmp api를 통해서 비교하게 되는데, cpu에서 고속의 비교 명령어를 제공한다고 해도 한번에 32bit나 64bit밖에 비교하지 못합니다. 

따라서, 'YYYY-MM-DD hh:mm:ss'를 char로 비교하게 되면, 최소 길이로 바꾼다고 해도 4+2+2+2+2+2 = 14바이트이고, 32bit환경에서 동시에 4bytes씩 비교한다고 해도, 최소 4회의 cycle이 소요됩니다.

말씀해주신 대로 year-month-day로 분리하고 키를 year-month-day 3컬럼에 대해 멀티플 컬럼 키를 설정한다고 하면 결국 8byte에 대해 strcmp를 수행하게 되는데, 32bit환경에서는 2 cycle에 비교가 완료되게 됩니다. 만약에 MySQL이 time_t에 기반한 DATETIME 컬럼 처리를 하고 있다면 이에 비해서는 char 처리가 다소 느리게 될 듯 싶습니다.

장황하게 적었는데요, MySQL의 내부 구현에 따라 내용이 달라질테니, 저라면 백만건 더미 데이터 넣어두고 양쪽을 비교해볼 것 같습니다. DATETIME에 대한 인덱스냐, char(4)+char(2)+char(2)에 대한 멀티키 인덱스냐로 말이죠.

박현우(lqez)님이 2009-02-18 17:17에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
28040[문의] 리눅스에서 mysqld 가 자동 리셋? [1]
골빈당
2009-02-19
5114
28039인덱스 [4]
이성식
2009-02-18
4735
28038남은부분 범위 뽑아오는 쿼리. [2]
이상
2009-02-18
4433
28037인덱스설정관련하여 날짜 타입 선정에 대해 조언부탁드립니다. [1]
이왕태
2009-02-17
5262
28036join시 max관련 질문드립니다. [1]
박균
2009-02-17
4241
28035*.MYD is not a MYISAM-table 이렇게 뜨는데 왜이런거죠 ㅜㅜ [1]
이현광
2009-02-17
4673
28034미러링 복구시 [2]
이성식
2009-02-17
4276
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.025초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다