같은컬럼 OR로 했을경우 index 문의드립니다. 0 2 998

by 이상훈 [MySQL] [2015.10.19 16:56:37]


제가 알고있기론 같은 컬럼을 OR 로 걸경우 index 가 타지않는다고 알고있습니다.

예를 들어 SELECT * FROM user WHERE user_id = 1 OR user_id = 2 는 index = X

그래서 보통 이런경우 상황에따라 in 이나 union 으로 나누고 있는데요 

1.SELECT * FROM user WHERE (user_id is null OR user_id = 2)

2.SELECT * FROM user WHERE user_id is null 

union

SELECT * FROM user WHERE user_id = 2

 

1번 방법으로 하였을시 성능이 2번보다 확연히 나쁠까요?

by 김태성 [2015.10.20 15:17:48]

초짜 답변이니까 참고만 하세요. 다른분이 정확하고 인증된 답변 주시면 감사하겠습니다.

일단 같은 필드를 OR로 검색하면 인덱스를 안탄다는것을 어디서 들으신건지 모르겠지만(진짜 안타는건지 타는건지 저도 잘 몰라요 ㅋ;) 실행계획을 본 결과 RANGE스캔해서 인덱스를 타고 있었습니다. 필드에 조건걸때 BETWEEN으로 걸어도 보통 RANGE스캔 하기때문에 제 생각엔 같은 필드를 OR조건 검색해도 인덱스를 타는 것 같습니다.

SELECT * FROM CUSTOMERS_INDEX WHERE CUST_ID = 1000 AND CUST_ID = 1001

위의 쿼리로 실행계획 돌려 본 결과 레인지 인덱스를 타서 코스트가 5정도 나왔습니다. 데이터는 55만건 있는 테이블이에요.

그리고 1과 2의 성능차를 여쭤보셨는데. 일단 전 실행계획을 보기전에 두개의 쿼리만 보고 아래의 쿼리가 검색을 두번해서 합치기때문에 1보다 성능이 나쁠 것 같다 예상했는데

실행계획 돌려보니 위의 쿼리는 코스트가 5 아래쿼리는 테이블 하나 검색당 3씩해서 6이 나왔습니다.

문제해결에 도움되면 좋겠네요. 다만 진심으로 다른 고수분이 명확하고 검증된 답변을 주시길 저도 기다리고있겠습니다 ;


by 이재현 [2015.10.20 17:30:25]

 

ORACLE 같은 경우 적정 인덱스가 있으면 OR 익스프레션으로 탑니다.

MY-SQL 같은 경우는 안탈겁니다. FTS가 발생 하다고하면 1번이 더 효율적이겠네요.

널값이 얼마 안되면 협의 진행하시고 -9999 같은 값으로 업데이트 진행하시고 로직 변경을 하면

2번이 효율적이죠

더 효율적인 방법은...

단, 업데이트 진행 및 -9999 의 건수가 미비할때...

 

SELECT * FROM user WHERE user_id = -9999

union ALL

SELECT * FROM user WHERE user_id = 2

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입