결합 인덱스 질문을 좀 하고 싶습니다..
1년전에 제가 만든 프로그램이 php 로 되어있는데 .. 잘 돌아가서 그냥 신경 안쓰고 있었는데
어제 업체에 가서 보니 .. 검색시 무척 느리다고 느껴서 .. 지금 보는 중입니다..
1년전엔 아무 개념이 없는 상태여서 인덱스만 하면 되는줄 알고 단일 칼럼별로 인덱스를 걸어놨습니다.
결합인덱스 전혀 없이요 .. 느릴수밖에 없다고 생각 됩니다.. 그래서 .. 자주 검색하는 항목 위주로 결합 인덱스를
하니 10배 20배 이상 향상 되는걸 확인 했구요 .. 그냥 꽁짜로 쓰고 계시긴 하지만.. 너무 제가 무관심 했나
싶은게 너무 미안하더군요 .. 그래서 결합 인덱스를 하려고 하는데 .. 제일 많이 쓰는쪽이 검색 쪽이거든요 ..
검색 조건이 많지는 않은데 .. 기준일자가 A,B,C,D,E,F 타입이 있고 컬럼이 다 틀리며
주문자 이름, 주문자 전화1, 주문자 전화2, 수취인, 수취인 전화1, 수취인전화2, 주소, 제품명
이정도 순입니다. 그런데 결합 인덱스를 작성 하려면 .. 보통 2컬럼 3컬럼 이런식의 예제만 있어서 혼란 스러운데요 ..
조합은
기준일자 a타입 19-01-01월부터 ..19-03-01 까지 주문자 김제연(통합검색으로 해놔서 LIKE %김제연%) + 주소 있을때 있고 없을때 있구요
초보때 만든거라 LIKE 의 개념이 없어서 그냥 %주소% 이런식입니다 --;;
보통은 이름 이나 전화번호로 검색해서 .. 이름 + 전화번호가 같이 검색 되는 경우는 잘 없구요 .. 한항목만 검색하게 되어있기 때문에
보통 저런식입니다.. 4~5개 칼럼이 있지만 이건 LIKE 가 아니어서 그냥 단일 인덱스로 놔도 될듯?
제가 생각하기엔 회사코드, 기준일자a, 주문자, 주소, 전화번호
회사코드, 기준일자B, 주문자, 주소, 전화번호
회사코드, 기준일자C, 주문자, 주소, 전화번호
회사코드, 기준일자D, 주문자, 주소, 전화번호
회사코드, 기준일자E, 주문자, 주소, 전화번호
회사코드, 기준일자F, 주문자, 주소, 전화번호
이런식으로 만들어야 할꺼 같은데 .. 이런식으로 .. 주문자 주소 전화번호 이런 인덱스가 중복된 상태에서 만드는게 맞는건지
틀린건지를 모르겠습니다.. 실제 SEARCH 의 검색 조건 수는 17개 정도 되는것 같습니다.. 위는 질문 하기 위해서 .. 몇개만
뺀거구요 .. 저렇게 하는게 맞는건지? 어떤식으로 나눠야 하는건지 모르겠습니다.. (나열하자면.. 판매처, 생산처, 쇼핑몰, 배송상태,
등등 입니다 이것들은 like 가 아닌 factory="하나공장" ) 이런식이구요 ..
mariadb 10.x 를 사용중입니다.. 조언 주시면 열심히 공부하겠습니다.
%검색어% 컬럼은 index 적용되지 않음
너무 많은 index는 전체 성능 감소 초래
범위검색(기간검색) 컬럼은 결합인덱스 생성시 가장 뒤
DBMS 종류와 버전에 따라 다르지만
일반적인 원칙 입니다.
이름을 검색한다고 치면.. name 컬럼이 있고 name 컬럼은 인덱스가 걸려 있습니다. (이런식으로 단일 인덱스로만 해놨습니다)
지금 상태에서 .. name like '%김제연%' 으로 검색하면.. 40만건을 ALL로 검색합니다.. 인덱스 안타구요 . 1.1 ~1.5 초가 걸리고 있구요
그런데 .. 다른 칼럼과 결합 인덱스를 사용해서 조회하면... 0.05초 가 걸립니다. 193000건이구요 또 하나의 인덱스를 추가해서 ..
조회해주면 그만큼 줄어든 10만건에서 검색해서 .. 0.015 초가 걸립니다... 그래서 .. 복합 인덱스를 걸긴 해야 하는데
어떻게 거는게 좋을지가 .. 의문입니다..
동일 조건에 이름을 빼고 조회해도
비슷한 속도 나올 거예요.
Index설계를 할때
슬로우 쿼리 수집해서
실행수 많은 쿼리의 검색조건 위주로 하고
가끔 사용하는 조건은 느리게 사용 하게 하거나
검색 필수 조건을 줍니다.
Index생성한 컬럼은 검색어% 처럼 뒷like 처리만 해서
Index를 이용할 수 있게 프로그램 합니다.
https://wyseburn.tistory.com/entry/MySQL-%ED%85%8C%EC%9D%B4%EB%B8%94%EA%B3%BC-%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EC%84%A4%EA%B3%84%EC%8B%9C-%EC%A3%BC%EC%9D%98%ED%95%B4%EC%95%BC-%ED%95%A0-13-%EA%B0%80%EC%A7%80