문서번호 : 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 |
결과 파일
Reindex 속도 비교
기존 Index에서 user_dictionary 를 추가하는 방식으로 테스트를 진행하였다.
•
SingleStore : 426.06(s) 소요
•
ElasticSearch: 775.75(s) 소요
테스트 스크립트
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 테스트 수정 |