<게시판 쿼리>
현재 사용하고 있는 게시판의 쿼리구조입니다.
게시판 리스트쿼리에서 주 메인으로 읽어오는 쿼리가 있고 (기본적으로
index_desc 힌트구문을
이용하여 역순으로 가져옴), 리스트 검색시에 조건에 따라서
where문 뒤에 검색조건을 붙이는 형식입니다.
ex)
$where = " WHERE GID > 0";
if(검색조건이 있을경우) {
switch(검색조건타입) {
case 'all': //전체검색
$where .= " AND (TITLE LIKE '%'||:search_text||'%' OR
CONTENTS LIKE '%'||:search_text||'%' OR CONTENTS2 LIKE
'%'||:search_text||'%')";
break;
case 'contents': //내용검색
$where .= " AND (CONTENTS LIKE '%'||:search_text||'%'
OR CONTENTS2 LIKE '%'||:search_text||'%')";
break;
default: //기타(제목, 글번호, 글쓴이)
$where .= " AND ".$param->get('search_kind')." LIKE
'%'||:search_text||'%'";
break;
}
}
'list' => "SELECT * FROM
(SELECT /*+ INDEX_DESC($table IDX_${table}) */
ROWNUM RNUM, ID, GID, THREAD, USER_ID, NICKNAME, HEAD, TITLE,
FILE_NAME, REF
FROM $table
$where)
WHERE RNUM > :m_rnum AND ROWNUM <=
:m_rownum
ORDER BY GID DESC, THREAD ASC, ID DESC"
구성된 인덱스
PK_AAA -> 컬럼(ID)
IDX_AAA_GID -> 컬럼(GID)
IDX_AAA_THREAD -> 컬럼(THREAD)
이렇게 구성이 되어있는데요.. 게시물수는 6만건정도이구요..
그런데 사용자가 좀 몰린다 싶으면 정말 느려지는거 같은데..
제가 사용하고 있는 이 방법의 개선점이 없을까요?
가장 마음에 걸리는 부분이 검색조건이 있을경우인데요..
검색시에도 INDEX_DESC 힌트구문을 사용하여 가져온다는 점이 좀
걸립니다.
검색조건이 있을경우에는 힌트구문을 바꿀수 있게끔 해야 하는게
맞을꺼란 생각이 드는데..
그렇게 되면 검색조건별로 사용되는 컬럼마다 인덱스를 생성해줘야
하는것인지..
예를들어 제목으로 검색할경우 INDEX_DESC(AAA IDX_AAA)가 아니라
제목컬럼으로 인덱스를
생성한 후 INDEX_DESC(AAA IDX_AAA_TITLE) 이렇게 힌트구문을
사용해서 가져와야 하는것인지..
후자의 방법이 성능상 좋지 않을까 하는 생각은 드는데..
그렇게 되면 인덱스의 무분별한 남용을 가져올수도 있다는 생각이
드네요..
과연 어떤방법으로 쿼리 및 힌트구문을 구성하고, 인덱스를
구성하는게 효율적인 방법일까요?
그리고 항상 어떤 한가지 검색조건이 붙는다고 하면.. 예를들어
KIND='A' 이런식의 쿼리가 항상
붙게된다면 인덱스 구성시 KIND 컬럼까지 더한 복합인덱스로 구성을
하는것이 효율적인 것일까요?
이렇게 생성해야 할 여러 인덱스마다 복합인덱스로 구성한다면(항상
KIND는 다 들어가겠죠)
정말 인덱스의 무분별한 사용이라는 생각이 드는데..
좀더 효율적인 방법이나 잘못된 점 지적해주시면 정말~~~
고맙겠습니다~~ (__)
|