MySQL BETWEEN 날짜 범위: 사용법, 주의점 및 성능 최적화

1. 소개

MySQL의 BETWEEN 연산자는 간단한 쿼리를 사용하여 특정 날짜 범위 내의 데이터를 검색할 수 있게 해 주는 편리한 기능입니다. 예를 들어, 월별 매출 데이터를 조회하거나 등록 날짜가 특정 기간에 해당하는 사용자를 검색할 때 유용합니다.

하지만 BETWEEN을 사용할 때는 DATEDATETIME 같은 데이터 타입이 어떻게 처리되는지와 잠재적인 성능 문제에 주의해야 합니다. 이 글에서는 기본 사용법부터 고급 기법까지 모든 것을 자세히 설명합니다.

2. MySQL BETWEEN 연산자의 기본

2.1 BETWEEN 기본 구문

BETWEEN 연산자는 지정된 범위 내의 값을 검색하는 데 사용됩니다. 기본 구문은 다음과 같습니다:

SELECT * FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31';

이 쿼리는 order_date2024년 1월 1일부터 2024년 1월 31일까지인 데이터를 검색합니다. 중요한 점은 BETWEEN시작 날짜와 종료 날짜 모두를 포함한다는 것입니다.

2.2 BETWEEN와 비교 연산자 (>= AND <=)

같은 결과를 얻기 위해 >=<=와 같은 비교 연산자를 조합해서 사용할 수도 있습니다.

SELECT * FROM orders
WHERE order_date >= '2024-01-01' AND order_date <= '2024-01-31';

BETWEEN의 장점:

  • 가독성이 높은 간단한 구문

>= AND <=의 장점:

  • 범위 조건을 보다 정밀하게 제어할 수 있음(예: 특정 시간을 제외).

예를 들어, DATETIME 컬럼에 BETWEEN을 사용할 경우 시간 정보가 포함되어 의도하지 않은 데이터가 검색될 수 있습니다. 다음 섹션에서 이를 자세히 설명합니다.

3. BETWEEN 사용 시 중요한 고려 사항

3.1 시간 정보가 포함된 컬럼 처리

DATETIME 컬럼에 BETWEEN을 사용하면 예상치 못한 결과가 발생할 수 있습니다.

SELECT * FROM users
WHERE created_at BETWEEN '2024-01-01' AND '2024-01-31';

이 쿼리는 2024-01-31 00:00:00까지의 데이터만 검색하므로 1월 31일 자정 이후에 생성된 레코드는 제외됩니다.

3.2 날짜 범위를 지정하는 올바른 방법

이 문제를 해결하기 위해 효과적인 방법은 종료 날짜를 다음 날보다 작게 설정하는 것입니다.

SELECT * FROM users
WHERE created_at >= '2024-01-01' AND created_at < '2024-02-01';

이와 같이 >=<를 사용하면 1월 31일 전체에 해당하는 모든 레코드를 신뢰성 있게 조회할 수 있습니다.

4. BETWEEN와 성능 최적화

4.1 인덱스와 BETWEEN의 관계

적절한 인덱스가 설정되어 있으면 BETWEEN 연산자는 효율적으로 동작합니다. 하지만 DATE() 함수를 사용하면 인덱스가 사용되지 않을 수 있으므로 주의가 필요합니다.

-- Index will not be used (not recommended)
SELECT * FROM users
WHERE DATE(created_at) BETWEEN '2024-01-01' AND '2024-01-31';

추천 쿼리:

SELECT * FROM users
WHERE created_at >= '2024-01-01' AND created_at < '2024-02-01';

4.2 EXPLAIN을 활용한 쿼리 최적화

성능을 확인하려면 EXPLAIN 명령을 사용하는 것이 도움이 됩니다.

EXPLAIN SELECT * FROM users WHERE created_at BETWEEN '2024-01-01' AND '2024-01-31';

이를 통해 사용된 인덱스와 실행 계획을 확인할 수 있습니다.

5. 흔히 저지르는 실수와 해결 방법

5.1 BETWEEN 사용 시 의도하지 않은 범위 조회

BETWEEN을 사용하더라도 시간 정보를 고려하지 않으면 의도하지 않은 데이터가 포함되거나 제외될 수 있습니다. 최선의 방법으로 >=<를 결합하는 것이 권장됩니다.

5.2 인덱스를 비활성화하는 쿼리

DATE()CAST()와 같은 함수를 사용하는 조건은 인덱스 사용을 방해할 수 있습니다. 가능한 경우 값을 직접 비교하도록 쿼리를 다시 작성하는 것이 가장 좋습니다.

6. 자주 묻는 질문 (FAQ)

Q1: BETWEEN는 시작 날짜와 종료 날짜를 모두 포함하나요?

→ 예, BETWEEN지정된 범위의 양쪽 경계를 모두 포함합니다.

Q2: BETWEEN을 사용해야 할까요, 아니면 >= AND <=를 사용해야 할까요?

→ 간단한 범위 조건에는 BETWEEN을 사용하세요. 시간 정보를 고려해야 할 경우, >= AND <를 권장합니다.

Q3: BETWEEN을 사용하면 쿼리가 느려질 수 있나요?

DATE()CAST()와 같은 함수를 사용하면 인덱스가 사용되지 않을 수 있습니다. 직접 비교를 권장합니다.

7. 실제 사용을 위한 실용적인 샘플 쿼리

7.1 특정 월의 데이터 조회

WHERE created_at BETWEEN '2024-02-01' AND '2024-02-28';

7.2 오늘 데이터 조회

WHERE created_at BETWEEN CURDATE() AND CURDATE() + INTERVAL 1 DAY;

7.3 지난 30일 데이터 조회

WHERE created_at BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE();

8. 요약

  • BETWEEN 연산자는 날짜 범위를 간단히 지정할 수 있지만, DATETIME 타입을 다룰 때는 추가적인 주의가 필요합니다.
  • BETWEEN시작 날짜와 종료 날짜를 모두 포함하므로, 올바른 범위 정의가 필수적입니다.
  • 성능 최적화를 위해 인덱스 활용이 중요하며, DATE() 함수 사용은 피해야 합니다.
  • >= AND <를 사용하면 보다 신뢰할 수 있는 범위 지정이 가능합니다.

이것으로 MySQL에서 BETWEEN 연산자를 사용할 때의 핵심 포인트에 대한 설명을 마칩니다. 실제 개발에 도움이 되길 바랍니다!