sqlite> .schema
create table tbl (
id integer primary key,
subj varchar(10),
spage int(7),
epage int(7)
);
create index idx1 on tbl(spage, epage);
sqlite> select * from tbl limit 10;
1|제 1장|1|3
2|제 2장|9|20
3|제 3장|33|39
4|제 4장|50|62
5|제 5장|73|95
6|제 6장|116|128
7|제 7장|193|211
8|제 8장|212|240
9|제 9장|241|273
10|제 10장|285|300
sqlite>
저희 상황에 맞게 책을 예로 들었습니다.
1페이지부터 3페이지 까지는 제 1장
9페이지부터 20페이지 까지는 제 2장
...
데이터에서 페이지가 겹치는곳은 없고 내용에 따라 범위는 들쑥날쑥 합니다.
이런 형식의 데이터가 30만건 들어 있을때,
특정 페이지를 조회할때 어떤 subject 가 나올건지 조회하는 겁니다.
select * from tbl where spage <= 849989 AND epage >= 849989;
이런식으로 조회를 할때, mysql 에서는 0.7초 정도 걸렸습니다.
explain 으로 확인해 보면 인덱스를 타지 않더군요 -_-;;
sqlite 에서는 어떨까 해서 시도해 봤는데 2초 정도 걸렸습니다.
이건 따로 확인할 방법이 없어서 다음처럼 확인하였습니다.
time -p ./sqlite2 mydata "select * from tbl where spage <= 849989 AND epage >= 849989;"
283330|제목849988|849988|849990
real 2.53
user 2.27
sys 0.26
mysql에서 0.7초가 병목으로 판단되어, 저부분만 sqlite 로 변경해 보려고 했는데,
인덱스를 타지 않는 경우에는 sqlite가 오히려 암울한 결과를 주네요.
어떻게 문제를 풀어야 할까요?
|