테이블에서 특정 조건에 맞는 row가 존재하는지 확인하는 로직을 기존 쿼리 함수를 통해서 구현하다가 문득 비효율적이라는 생각이 들었다.
count
라는 내장 함수를 사용하여 해당 조건에 일치하는 row의 개수를 구하고, count(row) > 0
이면 해당 row가 존재한다고 판단그래서 MySQL에서 row의 존재 여부를 확인하는 함수를 찾아보니 EXISTS
라는 키워드가 있었다.
그럼 row의 존재 여부를 확인하는 두가지 키워드 중 EXISTS vs COUNT 중에 어떤 키워드를 사용해야할까?
EXISTS는 서브쿼리
를 사용하여 특정 조건을 만족하는 row가 존재하는지 확인하는 데 사용한다.
EXISTS는 레코드가 존재할 경우 True를 반환하고 그렇지 않으면 False를 반환한다.
SELECT EXISTS(
SELECT id
FROM book
WHERE type = 'IT' and created_at > '2023-03-23' and price < 10000
)
장점
COUNT는 특정 조건을 만족하는 row의 개수를 반환하는 데 사용한다.
COUNT는 레코드의 개수를 알고 싶을 때 사용하며, 일반적으로 GROUP BY와 함께 사용되는 집계함수이다.
SELECT COUNT(id)
FROM book
WHERE type = 'IT' and created_at > '2023-03-23' and price < 10000
장점
애초에 쿼리의 목적 자체가 해당 row가 있는지 확인 하고 싶은 용도이기 때문에, COUNT 키워드를 사용하는건 용도에 맞지 않는 사용이였다. 또한, 잘못된 용도로 사용하면서 지속적으로 DB성능에 안좋은 영향을 주고 있었다.
또한, DB성능 뿐만 아니라, 서비스 서버의 메모리도 조금씩 낭비되고 있었다.
목적1을 위한 A라는 방법을 통해 더불어 목적2도 달성할 수 있을때, 목적2를 달성할 수 있다고 무작정 A라는 방법을 사용하는건 옳지 못한 행동이라고 생각한다.
목적에 알맞은 방법을 사용할 수 있도록 항상 경계해야겠다.
BenchmarkCountQuery-10 1 2409885708 ns/op
BenchmarkExistsQuery-10 20 51876602 ns/op