프로젝트/개인 프로젝트(2023.11.13-2023.12.18)

[개인프로젝트] ElasticSearch와 Mysql 쿼리 실행시간 (1)

dal_been 2024. 2. 15. 18:01
728x90

멘토링받다가 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에 인덱스 걸어서 테스트해봐야지!