Search

SingleStore FTS2 vs ElasticSearch 속도 측정

문서번호 : 11-3294943

Document Information

최초 작성일 : 2025.04.02
최종 수정일 : 2025.04.03
이 문서는 아래 버전을 기준으로 작성되었습니다.
SinglestoreDB: 8.9.17
ElasticSearch: 8.17.4

Goal

SingleStore 의 FTS2의 Nori 속도와 ElasticSearch의 Nori 속도의 데이터 Insert, Reindex, Select 속도를 비교하고자 한다.
측정 환경
8vcpu, 64GB (1 Unit)

Solution

SingleStore Table 구성

CREATE Table nori( Id BIGINT AUTO_INCREMENT PRIMARY KEY, text_data TEXT, FULLTEXT USING VERSION 2 (text_data) INDEX_OPTIONS'{"analyzer": "korean"}' );
SQL
복사

Insert data 속도 비교

본 측정 시간은 1Row 씩 데이터를 삽입하여 10000건의 row가 삽입되었을때 소요된 시간의 Max, Min, Mean, Median을 정리한 표이다. 총 데이터는 1000만건(1.7GB)을 삽입하였다.
Max(s)
Min(s)
Mean(s)
Median(s)
Sum(총 소요)
SingleStore
4.16
1.97
3.08
3.06
3080
ElasticSearch
28.91
24.29
25.04
25.04
25038.24

결과 파일

S2 Inesrt_result.txt
16.5KB
ES Insert_result
58.7KB

Reindex 속도 비교

기존 Index에서 user_dictionary 를 추가하는 방식으로 테스트를 진행하였다.
SingleStore : 426.06(s) 소요
ElasticSearch: 775.75(s) 소요

테스트 스크립트

S2_reindex.py
0.9KB
ES_reindex.py
1.7KB

Select 속도 비교

참고 사항

ElasticSearch는 deafult로 BM25를 사용하여 유사도 Score를 계산한다.
SingleStore의 경우 MATCH, BM25를 사용하여 유사도 Score를 계산한다.
## 10 Rows 쿼리 속도 비교 ## SingleStore (MATCH 사용) SELECT nori.*, MATCH (TABLE nori) AGAINST ('text_data: 한국') FROM nori WHERE MATCH (TABLE nori) AGAINST ('text_data: 한국') ORDER BY 3 DESC LIMIT 10; -> 15ms ## SingleStore (BM25 사용) SELECT nori.*, BM25(nori, 'text_data: 한국') FROM nori WHERE MATCH (TABLE nori) AGAINST ('text_data: 한국') ORDER BY 3 DESC LIMIT 10; -> 200ms ## ElasticSearch { "query": { "match": { "text_data": "한국" } }, "size": 10 } -> 15 ms ## 300 Rows 쿼리 속도 비교 ## SingleStore(MATCH 사용) SELECT nori.*, MATCH (TABLE nori) AGAINST ('text_data: 한국') FROM nori WHERE MATCH (TABLE nori) AGAINST ('text_data: 한국') ORDER BY 3 DESC LIMIT 300; -> 30~35ms ## SingleStore (BM25 사용) SELECT nori.*, BM25(nori, 'text_data: 한국') FROM nori WHERE MATCH (TABLE nori) AGAINST ('text_data: 한국') ORDER BY 3 DESC LIMIT 300; -> 216ms ## ElasticSearch { "query": { "match": { "text_data": "한국" } }, "size": 300 } -> 43ms ## 10000 Rows 쿼리 ## SingleStore (MATCH 사용) SELECT nori.*, MATCH (TABLE nori) AGAINST ('text_data: 한국') FROM nori WHERE MATCH (TABLE nori) AGAINST ('text_data: 한국') ORDER BY 3 DESC LIMIT 10000; -> 174ms ## SingleStore (BM25 사용) SELECT nori.*, BM25(nori, 'text_data: 한국') FROM nori WHERE MATCH (TABLE nori) AGAINST ('text_data: 한국') ORDER BY 3 DESC LIMIT 10000; -> 300ms ## ElasticSearch { "query": { "match": { "text_data": "한국" } }, "size": 10000 } -> 286ms ## 100000 Rows 쿼리 ## SingleStore (MATCH 사용) SELECT nori.*, MATCH (TABLE nori) AGAINST ('text_data: 한국') FROM nori WHERE MATCH (TABLE nori) AGAINST ('text_data: 한국') ORDER BY 3 DESC LIMIT 100000; -> 674ms ## SingleStore (BM25 사용) SELECT nori.*, BM25(nori, 'text_data: 한국') FROM nori WHERE MATCH (TABLE nori) AGAINST ('text_data: 한국') ORDER BY 3 DESC LIMIT 100000; -> 648ms ## ElasticSearch { "query": { "match": { "text_data": "한국" } }, "size": 100000 } -> 2060ms
SQL
복사

References

History

일자
작성자
비고
2025.04.02
hoon
최초 작성
2025.04.03
hoon
Select 테스트 수정