-
[SQL] Or 와 In 조건 뭐가 더 좋을까? SELECT OR vs IN, which is better performance.Spring Boot/DB 2022. 7. 15. 00:29
의제
SQL에서 아래 2개의 차이는 무엇이고 Performance는 어떤 것이 좋을까.
WHERE foo IN ('a', 'b', 'c') WHERE foo = 'a' OR foo = 'b' OR foo = 'c'
새로 입사한 신입 개발자 분의 질문으로 짧은 토론(?)이 있었다.
10년차 시니어님 : 아.. 이거 real my sql에서 본건데... 책 어디갔어요..! (내가 집에 모셔두었다...)
5년차 개발자 친구 : in() 이 더 빠르지 않니? 검색해이쉬.
3년차 개발자 동료 : or 가 더 빠르지 않을까요? in 은 전부 스캔하는 느낌이고, or는 하나라도 맞으면 결과 낼꺼 같은데.
즉.. 명확하게 어떤 것이 좋다 나오지 않아서 검색해 보았다.
결론
12년 전에는… from stackOverflow
- Oracle은 Performance가 똑같다.
- 옵티마이저가 알파벳 순서로 실행 계획을 세운다.
- MySQL은 어떤 데이터로 검색할지 따라서 실행 계획이 달라진다.
- 검색 기준이 동적이면 in을 정적이면 or를 쓰자.
2018년 기준..
- 많은 데이터베이스(Oracle, Postgresql)에서 다중의 OR이랑 IN()은 논리적으로 같다. 따라서 동의어라 볼 수 있다.
In many database servers, IN() is just a synonym for multiple OR clauses, because the two are logically equivalent.
- MySQL은 좀 다르다. IN()을 정렬하고, 값이 부합 하는지 이진탐색을 한다.
- IN() → 로그 함수 O(Log n)
- OR → 지수 함수 O(n)
- n = 1000 일때 log n = 3
- 즉, MySQL에서는 list의 size가 크면 IN()을 사용하는게 훨씬 빠르다.
Not so in MySQL, which sorts the values in the IN() list and uses a fast binary search to see whether a value is in the list. This is O(Log n) in the size of the list, whereas an equivalent series of OR clauses is O(n) in the size of the list (i.e., much slower for large lists)
참고 - Big-O 표기법
출처
https://stackoverflow.com/questions/782915/mysql-or-vs-in-performance
반응형'Spring Boot > DB' 카테고리의 다른 글
[DB] ACID란? Transaction이란? (0) 2023.06.28 [M1 Mac] Mysql 명령어 정리 (+ docker로 설치) (0) 2023.06.27 Flyway로 데이터베이스 마이그레이션 해보자 (이론편) (0) 2022.07.14 [Mybatis 시리즈 2] DataSouce와 DBCP (DataBase Connection Pool) (0) 2022.04.14 [Mybatis 시리즈 1] 동작 원리와 스프링에서 어떻게 사용될까? (0) 2022.04.14 - Oracle은 Performance가 똑같다.