고수님들 조언부탁드립니다 ㅡㅡ 0 4 845

by 호야별리 [DB 기타] [2016.03.18 07:52:21]


안녕들하세요...

아쉬울때만 이곳에 찾아오는 생초보입니다 ㅡㅡ

서명사이트를 운영중인데요.

데이터가 계속해서 증가하고있고 현재는 170만건이상의 서명데이터가 있습니다.

문제는 서명카운터를 할때 속도가 현저히 느려집니다.

프로그램로직은

SELECT COUNT(*) FROM <테이블명> WHERE NAME LIKE '이름%' AND email LIKE '이메일%'

위와같이 카운터를 합니다. (중복체크)

이방법 저방법을 사용해봐도 3~5초이상 걸리는데 혹시 어떤부분을 체크를 해줘야하는지

조언좀 부탁드리겠습니다. 감사합니다.

by 마농 [2016.03.18 08:06:57]

name 과 email 로 구성된 결합인덱스 있으면 됩니다.
그런데...
중복체크 기능을 구현한다면 LIKE 검색이 아닌 = 검색이 맞는거 아닌가요?


by 호야별리 [2016.03.18 08:10:50]

아...답변감사합니다.
마농님 말씀대로 = 이 맞네요. 이방법 저방법 강구하다보니 예시를 잘못올렸네요.

말씀대로 결합인덱스를 한다고 했을때.

기존에 다른 결합인덱스가 있는것들에 또다시 결합인덱스를 하게되면 속도가 더 느려지지 않나요?


by 창조의날개 [2016.03.18 09:02:51]
CREATE UNIQUE INDEX 인덱스이름 ON 테이블명 (NAME, EMAIL);

위와 같이 인덱스를 추가 하면 됩니다.

다만 UNIQUE를 넣으면 NAME, EMAIL을 기준으로 같은 것이 INSERT될때 DBMS에서 에러를 표출하여 INSERT 되는 것을 방지 해주고 NAME, EMAIL을 = 검색으로 SELECT 할때 그냥 INDEX 보다 빠르게 검색 합니다.

 

중복을 허용해서 인덱스를 만들려면 UNIQUE를 빼면 됩니다.

 

컬럼을 2개 이상으로 인덱스를 만드는걸 결합 인덱스라 합니다.

 

주의 할 점으로는 기존에 NAME, EMAIL로 인덱스가 들어가서 인덱스가 만들어져 있는 것이 있다면 인덱스 경합이 일어나지 않고도록 조율이 필요 합니다..

 


by 비주류 [2016.03.18 09:18:19]

중복 체크라면, SELECT 1 FROM ... WHERE EXISTS 로 체크해볼 수도 있을 것 같고요,

아예 unique 제약 걸어서 중복 체크 부분을 빼도 될 것 같습니다.

건수가 증가하면서 계속해서 느려질텐데요, 파티셔닝이나 데이터 커팅이 필요할 수도 있겠습니다.

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