MySQL 바이너리 검색시 인덱스를 타게하기
※ 경고 높이뜬새의 모르는 사람이 없는 팁시리즈 입니다. 이 팁시리즈는 지면낭비라는 항의시에 즉각 중단됩니다.
|
MySQL에서 많이들 사용하는 varchar, char, text 타입은 non binary 타입이기 때문에 대소문자 구분을 하지 못합니다.
즉 검색할때 대소문자 구분없이 결과값을 돌려준다는 말씀입니다. ('AAA'든 'aaa' 구분을 하지 못하는거 잘 알고 계실겁니다 )
그럴경우에 강제로 binary 타입으로 캐스팅을 해주면 대소문자를 구분하여 결과값을 돌려주게 됩니다.
SELECT * FROM [테이블명] WHERE binary(컬럼1) = 'ABCd'; 위의 컬럼1이 테이블 생성시에 varchar, char, text 타입등으로 생성된 컬럼이라 할지라도 binary 타입으로 캐스팅 하였기 때문에 정확히 대소문자를 구분하여 해당하는 결과값만 보여주게 됩니다.
인덱스를 타지 않는 아래와 같은 쿼리에서는 아무 문제가 없습니다.
SELECT * FROM bbs_board WHERE binary(nickname) like '%ABCd%';
하지만 아래의 쿼리에서 nickname 컬럼이 Key Index일 경우에는 문제가 발생합니다.
SELECT * FROM bbs_board WHERE binary(nickname) = 'ABCd';
nickname 컬럼이 생성시에 varchar 타입으로 생성되었다고 가정할때, varchar 타입을 binary 타입으로 캐스팅 하였기 때문에 Key 를 타지 못하게 됩니다. Key를 타게 할려면 컬럼을 binary로 캐스팅 하지 말고 "검색어" 즉 "키워드"를 binary 타입으로 캐스팅 해주세요.
SELECT * FROM bbs_board WHERE nickname = binary 'ABCd';
SELECT * FROM [테이블명] WHERE (컬럼명) = binary '키워드'; |
|
위와 예와 같이 쿼리를 날려주시면 인덱스도 타면서, 대소문자도 구분도 아주 잘해 준답니다. |
|
|