웹페이지에서 검색 조건이 없이
전체 조건으로 검색하는 쿼리입니다.
SELECT PY_NO, APPLY_TYPE, UNI_NAME, UNI_YEAR, HI_NAME, HI_YEAR, MS_NAME, MS_YEAR, ES_NAME, ES_YEAR, UNI_MAJOR, PY_PHONE, BANK_NAME, BANK_NUM, BANK_OWNER, PY_YN, PY_ETC, ST_PK, ADDER, ADD_DATE, PY_DATE, PY_MONEY, ST_NAME, ST_ADDRESS, PR_ADDRESS, PR_NAME, PY_COUNT FROM ACT_PAYMENT_TB ORDER BY ST_NAME ASC, APPLY_TYPE ASC, PY_COUNT ASC, PY_DATE ASC
위의 쿼리를 explain 했을 경우 type all로 스캔을 합니다.
특정 조건이 없기때문에 order by를 index를 태우려고 합니다
구글링을 참고하여
order by 절에 있는 컬럼으로
다중 인덱스 컬럼을 설정한 후 (인덱스 컬럼 순서 ST_NAME, APPLY_TYPE, PY_COUNT, PY_DATE)
ORDER BY ST_NAME, APLLTY_TYPE, PY_COUNT, PY_DATE;
로 변경한 후 EXPLAIN 해보았지만 아무 변화가 없었습니다.
1.어떤 부분을 수정하면 order by 절에서 index를 사용할수 있을까요?
2.검색조건이 없이 전체 데이터 검색 시에는 index를 사용할 필요가 없을까요?
선배님들의 가르침 부탁드립니다.
1. 전체 스캔의 경우에는
- 인덱스 스캔이 풀스캔보다 불리합니다.
2. 웹페이지 용도라면?
- 페이징 처리가 필요해 보입니다.
- 페이징 처리를 한다면? 인덱스 스캔이 풀스캔보다 유리합니다.
3. 억지로 인덱스를 태우려면 힌트 등을 이용하는 방법이 있는데.
- 전제조건으로 인덱스 안에 모든 행이 있어야 합니다.
- 예를 들면 4개 항목 다 널인 행은 인덱스에 포함되지 않습니다. (풀스캔과 인덱스 스캔의 결과가 다름)
- 4개 항목 중에 NOT NULL 설정된 항목이 하나라도 있어야 합니다.
- 만약 NOT NULL 설정은 안되어 있지만 업무적 특성으로 널이 없는 항목이 있다면
- 해당 항목에 대한 NOT NULL 조건을 WHERE 절에 추가해 주면 됩니다.