Elasticsearch 집계(aggregation)와 MySQL GROUP BY 비교하기

DOHYEON AN·2023년 7월 10일
0

data-engineering

목록 보기
1/3

안녕하세요, 오늘은 Elasticsearch의 집계 기능에 대해 알아보고, 이를 전통적인 SQL의 GROUP BY 절과 비교해보겠습니다. 이를 통해 Elasticsearch의 집계가 어떻게 동작하는지 이해하고, 관계형 데이터베이스와 NoSQL 데이터베이스 간의 차이점을 이해하는 데 도움이 될 것입니다.

먼저, 예시를 위해 다음과 같은 데이터셋을 가지고 있습니다라고 가정해봅시다.

#products 인덱스:
[
  { "product_id": 1, "category": "Electronics", "price": 200 },
  { "product_id": 2, "category": "Electronics", "price": 150 },
  { "product_id": 3, "category": "Books", "price": 20 },
  { "product_id": 4, "category": "Books", "price": 25 },
  { "product_id": 5, "category": "Books", "price": 30 },
  { "product_id": 6, "category": "Electronics", "price": 300 }
]

이 데이터셋은 간단한 제품 목록을 나타냅니다. 각 제품은 product_id, category, price 필드를 가지고 있습니다.

1. Elasticsearch 집계(Aggregation)

Elasticsearch에서는 집계를 사용하여 데이터에 대한 복잡한 분석을 수행할 수 있습니다. 'terms' 집계와 'stats' 집계를 결합하여 특정 필드를 기준으로 그룹을 만들고, 그룹별로 통계를 계산해봅시다.

#GET /products/_search
{
  "size": 0,
  "aggs": {
    "group_by_category": {
      "terms": {
        "field": "category.keyword"
      },
      "aggs": {
        "price_stats": {
          "stats": {
            "field": "price"
          }
        }
      }
    }
  }
}

💡 잠깐! 여기서 “size”: 0 의 의미는 무엇일까?

Elasticsearch 쿼리에서 "size" 파라미터는 반환할 검색 결과의 문서 수를 지정합니다. 기본적으로 "size"는 10으로 설정되어 있습니다. 이는 한 번의 검색 쿼리로 기본적으로 최대 10개의 문서를 반환한다는 의미입니다.
그러나 "size": 0를 설정하면, Elasticsearch는 검색 결과의 문서를 전혀 반환하지 않습니다. 대신, 요청한 집계 정보만 반환합니다. 이러한 설정은 문서 자체보다는 문서의 집계 정보가 필요한 경우, 예를 들어 문서의 개수, 평균, 합계 등을 계산하고 싶을 때 유용합니다. 이렇게 하면 불필요한 네트워크 트래픽과 처리 시간을 절약할 수 있습니다.
따라서 "size": 0는 "문서 검색 결과를 반환하지 말고, 집계 정보만 반환해라"라는 의미로 해석할 수 있습니다.


다시 쿼리문으로 돌아와서, 위 쿼리는 category.keyword 필드의 각 유일한 값에 대해 price 필드에 대한 통계를 계산합니다. 결과는 다음과 같습니다.

{
  ...
  "aggregations": {
    "group_by_category": {
      "buckets": [
        {
          "key": "Electronics",
          "doc_count": 3,
          "price_stats": {
            "count": 3,
            "min": 150,
            "max": 300,
            "avg": 216.67,
            "sum": 650
          }
        },
        {
          "key": "Books",
          "doc_count": 3,
          "price_stats": {
            "count": 3,
            "min": 20,
            "max": 30,
            "avg": 25,
            "sum": 75
          }
        }
      ]
    }
  }
}

2. MySQL의 Group by

이제 같은 작업을 SQL을 사용하여 수행해 보겠습니다. GROUP BY 절은 특정 열을 기준으로 행을 그룹화하고, 각 그룹에 대해 통계를 계산할 수 있게 해줍니다.

SELECT category, COUNT(*), MIN(price), MAX(price), AVG(price), SUM(price)
FROM products
GROUP BY category;

이 쿼리는 'category' 필드의 각 유일한 값에 대해 'price' 필드에 대한 통계를 계산합니다. 결과는 다음과 같습니다.

+-------------+----------+-----------+-----------+-----------+----------+
| category    | COUNT(*) | MIN(price)| MAX(price)| AVG(price)| SUM(price)|
+-------------+----------+-----------+-----------+-----------+----------+
| Electronics | 3        | 150       | 300       | 216.67    | 650      |
| Books       | 3        | 20        | 30        | 25        | 75       |
+-------------+----------+-----------+-----------+-----------+----------+

결론

Elasticsearch의 집계와 SQL의 GROUP BY는 비슷하게 동작하지만, Elasticsearch는 NoSQL 데이터베이스로써 스키마리스 데이터와 복잡한 중첩 데이터 구조를 처리하는 데 더 강점을 가지고 있습니다. 반면에, SQL은 관계형 데이터 모델에 최적화되어 있으며, 테이블 간의 관계를 기반으로 데이터를 조작하고 질의하는데 효율적입니다.

이상으로 Elasticsearch와 SQL의 차이와 그 사용 방법에 대해 간략하게 살펴보았습니다. 향후에는 더 복잡한 집계와 분석을 위해 Elasticsearch의 다양한 집계 기능을 활용하는 방법에 대해 알아보겠습니다. 감사합니다!

profile
데이터 엔지니어 안도현입니다 :)

0개의 댓글