COUNT vs EXISTS

chanbro·2023년 3월 22일
0

MySQL

목록 보기
1/1
post-thumbnail

조건에 만족하는 row가 있는지 확인

테이블에서 특정 조건에 맞는 row가 존재하는지 확인하는 로직을 기존 쿼리 함수를 통해서 구현하다가 문득 비효율적이라는 생각이 들었다.

  • 기존 로직 : DBMS의 count 라는 내장 함수를 사용하여 해당 조건에 일치하는 row의 개수를 구하고, count(row) > 0 이면 해당 row가 존재한다고 판단
  • 기존 로직 : 해당 조건의 Select 쿼리를 보내 row 결과가 있는지 확인

그래서 MySQL에서 row의 존재 여부를 확인하는 함수를 찾아보니 EXISTS 라는 키워드가 있었다.
그럼 row의 존재 여부를 확인하는 두가지 키워드 중 EXISTS vs COUNT 중에 어떤 키워드를 사용해야할까?

EXISTS

EXISTS는 서브쿼리를 사용하여 특정 조건을 만족하는 row가 존재하는지 확인하는 데 사용한다.
EXISTS는 레코드가 존재할 경우 True를 반환하고 그렇지 않으면 False를 반환한다.

SELECT EXISTS(
  SELECT id
  FROM book
  WHERE type = 'IT' and created_at > '2023-03-23' and price < 10000
)

장점

  • row의 존재 여부만 확인할 때 빠른 성능을 제공한다.
  • 조건에 일치하는 row를 찾으면 즉시 결과를 반환하므로 전체 테이블을 스캔하지 않는다.
    단점
  • 조건에 일치하는 row의 개수를 알 수 없다.

COUNT

COUNT는 특정 조건을 만족하는 row의 개수를 반환하는 데 사용한다.
COUNT는 레코드의 개수를 알고 싶을 때 사용하며, 일반적으로 GROUP BY와 함께 사용되는 집계함수이다.

SELECT COUNT(id)
FROM book
WHERE type = 'IT' and created_at > '2023-03-23' and price < 10000

장점

  • row의 개수를 정확하게 알 수 있습니다.
  • 집계 함수로 사용할 수 있어 분석 및 보고 작업에 유용하다.
    단점
  • 전체 테이블을 스캔해야 하므로 성능에 영향을 줄 수 있습니다.

결론

애초에 쿼리의 목적 자체가 해당 row가 있는지 확인 하고 싶은 용도이기 때문에, COUNT 키워드를 사용하는건 용도에 맞지 않는 사용이였다. 또한, 잘못된 용도로 사용하면서 지속적으로 DB성능에 안좋은 영향을 주고 있었다.
또한, DB성능 뿐만 아니라, 서비스 서버의 메모리도 조금씩 낭비되고 있었다.

목적1을 위한 A라는 방법을 통해 더불어 목적2도 달성할 수 있을때, 목적2를 달성할 수 있다고 무작정 A라는 방법을 사용하는건 옳지 못한 행동이라고 생각한다.
목적에 알맞은 방법을 사용할 수 있도록 항상 경계해야겠다.

go 서버 밴치마크

BenchmarkCountQuery-10    	       1	2409885708 ns/op
BenchmarkExistsQuery-10    	      20	  51876602 ns/op
profile
이유있는 코드를 작성하는 서버 개발자

0개의 댓글