[개인프로젝트] ElasticSearch와 Mysql 쿼리 실행시간 (1)
멘토링받다가 ElasticSearch 왜 사용했어요?? 질문하셨다. 그래서 mysql 인덱스를 사용하지 않는다는 가정하에 간단하게 말씀드렸다.
멘토님의 답변.. 인덱스 쓰면 생각보다 쿼리 빠르게 나온다고.!
그래서 이번 기회에 간단하게 테스트 해보려고 한다.
산책 대행자를 검색하기 위해서 거리기준, 이름으로 기준을 정하였다.(mysql 인덱스 설정안되어있음)
처음 테스트할때는 Elasticsearch와 mysql에 10000개의 데이터를 임시로 넣었다.
10000개로 테스트
Mysql
SELECT
ST_Distance_Sphere(Point(127.0637948147,37.3232)
,Point(users.user_lnt,users.user_lat)) AS distance
FROM
users
WHERE
ST_Distance_Sphere(Point(127.0637948147,37.3232) ,Point(users.user_lnt,users.user_lat)) <= 3000
AND users.user_name like '%test8%'
ORDER BY
distance
LIMIT 0,10
in set 0.078
ElasticSearch
GET walkers/_search
{"from":0,"post_filter":
{"geo_distance":
{"location":{"lat":37.3017387,"lon":127.0735513},"distance":"3km","distance_type":"plane"}},
"query":
{"bool":
{"must":
[{"query_string":
{"analyze_wildcard":true,
"fields":["walker_name"],"query":"*test12*"}
}]}},
"size":10,"track_scores":false,"version":true
}
쿼리 실행 시간: 118 밀리초
처음 10000개로 테스트할때는 사실 거의 차이가 없었다. 둘다 평균 100ms??정도 였다.
그래서 엥?? 왜 ElasticSearch를 사용한거지??라는 생각이 들었다. 그래서 인터넷이 찾아보니 데이터가 조금 더 넣어서 해봐야할거같았다. 그래서 2만개로 테스트 시작!
2만개로 테스트
1. 이름기준으로 테스트
▷ Mysql
mysql> select * from users where users.user_name like '%test10%';
11111 rows in set (0.12 sec) -> 120ms
▷ ElasticSearch
GET walkers/_search
{
"query":
{"bool":
{"must":
[{"query_string":
{"analyze_wildcard":true,
"fields":["walker_name"],"query":"*test8*"}
}]}}
}
72ms
약 Elasticsearch가 1.3배 정도 빠르다.
2. 거리 기준 테스트
▷ Mysql
select ST_Distance_Sphere(Point(127.0637948147,37.3232)
,Point(users.user_lnt,users.user_lat)) as distance from users where ST_Distance_Sphere(Point(127.0637948147,37.3232)
,Point(users.user_lnt,users.user_lat)) <= 3000
434 rows in set (0.15 sec) -> 150ms
▷ ElasticSearch
GET walkers/_search
{
"post_filter":
{"geo_distance":
{"location":{"lat":37.3232,"lon":127.0637948147},
"distance":"3km","distance_type":"plane"
}
}
}
88ms
약 Elasticsearch가 1.7배 빠르다
3. 이름과 거리 기준 테스트
▷ Mysql
SELECT
ST_Distance_Sphere(Point(127.0637948147,37.3232)
,Point(users.user_lnt,users.user_lat)) AS distance
FROM
users
WHERE
ST_Distance_Sphere(Point(127.0637948147,37.3232) ,Point(users.user_lnt,users.user_lat)) <= 3000
AND users.user_name like '%test8%'
ORDER BY
distance
LIMIT 0,10
100 rows in set (0.18 sec) -> 180ms
최소 170ms, 최대 190ms, 평균 180ms
▷ ElasticSearch
GET walkers/_search
{"from":0,"post_filter":
{"geo_distance":
{"location":{"lat":37.3232,"lon":127.0637948147},"distance":"3km","distance_type":"plane"}},
"query":
{"bool":
{"must":
[{"query_string":
{"analyze_wildcard":true,
"fields":["walker_name"],"query":"*test8*"}
}]}},
"size":10,"track_scores":false,"version":true
}
65ms
최소 26ms, 최대 80ms, 평균 50ms
ElasticSearch가 약 2.5배에서 2.8배정도빠르다.
확실히 데이터가 많을때 Mysql과 Elasticsearch가 차이가 난다.
물론 mysql에 인덱스를 걸면 좀더빨라질 수 있을 것같다. 다음 블로그는 mysql에 인덱스 걸어서 테스트해봐야지!