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 28039 게시물 읽기
No. 28039
인덱스
작성자
이성식(jamesdean017)
작성일
2009-02-18 15:48
조회수
4,735

날짜 검색을 2월 1일부터 15일까지 하면 인덱스가 잘 타는데요 2월 1일부터 3월 1일까지 하면 인덱스를 못탑니다.


원인이 어떤게 있을까요?? 데이터 필드들의 값을 확인 했구요..

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

흥미로운 문제네요.

테이블의 description과 해당 쿼리문을 올려주시면 함께 문제를 해결해보는데 도움이 될 듯 싶습니다.

박현우(lqez)님이 2009-02-21 13:18에 작성한 댓글입니다.
explain SELECT * FROM `Test` WHERE 1 AND Time > UNIX_TIMESTAMP( '2009-02-01' ) AND Time < UNIX_TIMESTAMP( '2009-02-15' )
의 경우 

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE Test range Time Time 4 NULL 200 Using where

같은 쿼리를 3월 1일로 바꿨을때

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE Test ALL Time NULL NULL NULL 3008 Using where

이런식으로 type 이 All 로 됩니다.

데이터 양 차이도 얼마 차이가 안나는데 이러는군요..
이성식(jamesdean017)님이 2009-02-24 17:47에 작성한 댓글입니다.

안녕하세요 박성원입니다.

오호.. 먼가 궁금증을 확~ 불러 일으키는 문제인듯합니다. ^^;;

혹시 몰라서 좌변에 함수를 넣으면 안되는거지만 변환이라 이방법으로 했을때의 결과가 어떻게 되나요?


explain SELECT * FROM `Test` WHERE from_unixtime(Time) between '2009-02-01' and '2009-02-15'


대략 반환값이 시간을 포함하게된다면 date_foramat을 또 써야하는데 그럼 더 이상해질듯해서요 ;;

일딴 상기퀴리로 한번 분석을 ^^;;


ps.. unixtime때문에 예전에 많이 고생했었는데 지금보니 감회가 새롭네요 ㅋ

박성원(darkancia)님이 2009-02-25 11:30에 작성한 댓글입니다.

SELECT 'all' AS cntrange, COUNT(*) AS cnt FROM `Test` WHERE 1

UNION ALL

SELECT 'half Feb', COUNT(*) FROM `Test` WHERE 1 AND Time > UNIX_TIMESTAMP( '2009-02-01' ) AND Time < UNIX_TIMESTAMP( '2009-02-15' )

UNION ALL

SELECT 'full Feb', COUNT(*) FROM `Test` WHERE 1 AND Time > UNIX_TIMESTAMP( '2009-02-01' ) AND Time < UNIX_TIMESTAMP( '2009-03-01' );

 

위 쿼리를 실행한 결과에 답이 들어있지 않을까 생각이 됩니다.

 

실행을 해보고 들여다 보지 않아서 짐작이지만

all과 full Feb는 거의 차이가 나지 않는 수치가 나오고

half Feb의 경우에는 all이나 full Feb보다는 비교적 적은 수치가 나온다면

DBMS는 주어진 쿼리를 수행함에 있어서

'3월 1일까지의 data를 가져오는 경우 뭐 이건 어차피 대부분의 data를 퍼 올리라는 얘기네 굳이 인덱스 갔다 데이터 갔다 왔다갔다 하다가 시간 다 잡아먹느니 그냥 몽창 퍼 올리고 필요없는걸 버리는 게 훨씬 쉽겠군'이라고 판단을 한 경우고,

'2월 15일까지만 가져오면 되는거지? 전체 다 읽어보는 것보단 당연히 색인을 보고 필요한 data만 쏙쏙 뽑아올리는게 더 빠르겠군'이라고 판단한 경우가 아닐까 싶습니다.

 

뭐 좀 더 알아보시려면 Cardinality, Density, Selectivity, index 등의 키워드로 검색을 해보시면 이해에 도움이 될만한 문서들을 찾아보실 수 있습니다.

우욱님이 2009-02-25 17:10에 작성한 댓글입니다.
이 댓글은 2009-02-25 17:10에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
28043테이블에서.. [2]
이성식
2009-02-19
5088
28041단순한 쿼리 질문입니다.. [7]
새내기
2009-02-19
5040
28040[문의] 리눅스에서 mysqld 가 자동 리셋? [1]
골빈당
2009-02-19
5114
28039인덱스 [4]
이성식
2009-02-18
4735
28038남은부분 범위 뽑아오는 쿼리. [2]
이상
2009-02-18
4433
28037인덱스설정관련하여 날짜 타입 선정에 대해 조언부탁드립니다. [1]
이왕태
2009-02-17
5261
28036join시 max관련 질문드립니다. [1]
박균
2009-02-17
4241
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다