database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 29913 게시물 읽기
No. 29913
count 쿼리 속도가 너무 차이가 나서요...
작성자
이승예
작성일
2011-02-17 10:34
조회수
10,985

 

아래와 같은 쿼리가 있는데요 이상태로 실행시키면 속도가 나쁘지 않습니다.

select * from morning_buyer_table
where register_date >= 1199113200
AND buyer_store = 0
and (
       (
          buyer_sess LIKE '%주영%' OR
          buyer_name1 LIKE '%주영%' OR
          buyer_name2 LIKE '%주영%' OR
          buyer_name3 LIKE '%주영%' OR
          REPLACE(REPLACE(buyer_tel1,' ',''),'-','') LIKE '%주영%' OR
          REPLACE(REPLACE(buyer_tel2,' ',''),'-','') LIKE '%주영%' OR
          REPLACE(REPLACE(buyer_tel3,' ',''),'-','') LIKE '%주영%' OR
          REPLACE(REPLACE(buyer_tel4,' ',''),'-','') LIKE '%주영%' OR
          buyer_main LIKE '%주영%'
       )
       OR
       buyer_sess in
       (
          select sess
          from ecm_memo_cs_new
          where (comment LIKE '%주영%' OR comment_manager LIKE '%주영%')
       )
       OR
       buyer_sess in
       (
          select sess
          from ecm_memo
          where (comment LIKE '%주영%')
       )
) ORDER BY register_date DESC LIMIT 0, 100

그런데 페이징 처리를 위해 total row수를 알기 위해 쿼리문을 아래처럼 변경하면 속도가 많이 느려집니다.

select count(*) from morning_buyer_table
where register_date >= 1266591600
AND buyer_store = 0
and (
       (
          buyer_sess LIKE '%주영%' OR
          buyer_name1 LIKE '%주영%' OR
          buyer_name2 LIKE '%주영%' OR
          buyer_name3 LIKE '%주영%' OR
          REPLACE(REPLACE(buyer_tel1,' ',''),'-','') LIKE '%주영%' OR
          REPLACE(REPLACE(buyer_tel2,' ',''),'-','') LIKE '%주영%' OR
          REPLACE(REPLACE(buyer_tel3,' ',''),'-','') LIKE '%주영%' OR
          REPLACE(REPLACE(buyer_tel4,' ',''),'-','') LIKE '%주영%' OR
          buyer_main LIKE '%주영%'
       )
       OR
       buyer_sess in
       (
          select sess
          from ecm_memo_cs_new
          where (comment LIKE '%주영%' OR comment_manager LIKE '%주영%')
       )
       OR
       buyer_sess in
       (
          select sess
          from ecm_memo
          where (comment LIKE '%주영%')
       )
) LIMIT 1

속도를 개선하기 위한 방법은 어떤게 있을가요? 도통모르겟습니다....

아래는 카운트 쿼리 explain 입니다.

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY morning_buyer_table range register_date register_date 4   104783 Using where
3 DEPENDENT SUBQUERY ecm_memo unique_subquery sess sess 32 func 1 Using where
2 DEPENDENT SUBQUERY ecm_memo_cs_new index_subquery sess sess 32 func 1 Using where

morning_buyer_table에는 287864개의 rows

ecm_memo에는 67903개의 rows

ecm_memo_cs_new에는 39644개의 rows가 있습니다.

 

이 글에 대한 댓글이 총 3건 있습니다.

데이터를 불러오실 때 

select SQL_CALC_FOUND_ROWS * from morning_buyer_table
where register_date >= 1199113200 
AND buyer_store = 0
and (
       (
          buyer_sess LIKE '%주영%' OR
          buyer_name1 LIKE '%주영%' OR
          buyer_name2 LIKE '%주영%' OR
          buyer_name3 LIKE '%주영%' OR
          REPLACE(REPLACE(buyer_tel1,' ',''),'-','') LIKE '%주영%' OR
          REPLACE(REPLACE(buyer_tel2,' ',''),'-','') LIKE '%주영%' OR
          REPLACE(REPLACE(buyer_tel3,' ',''),'-','') LIKE '%주영%' OR
          REPLACE(REPLACE(buyer_tel4,' ',''),'-','') LIKE '%주영%' OR
          buyer_main LIKE '%주영%'
       )
       OR
       buyer_sess in
       (
          select sess
          from ecm_memo_cs_new
          where (comment LIKE '%주영%' OR comment_manager LIKE '%주영%')
       )
       OR
       buyer_sess in
       (
          select sess
          from ecm_memo
          where (comment LIKE '%주영%')
       )
) ORDER BY register_date DESC LIMIT 0, 100

카운트를 할때 

select found_rows() ;

요렇게 하시면 어떨까요?

김현진(elegantcoder)님이 2011-02-19 12:15에 작성한 댓글입니다.

네 그렇게도 해봤는데 그럼 속도가 더 느리더라구요...

이승예님이 2011-02-21 15:45에 작성한 댓글입니다. Edit

 처음 실행하신 쿼리에는 LIMIT 0,100 으로 제한을 주셨기 때문에 검색 결과가 100건이 되면 바로 검색을 중지합니다.

반면 두번째 쿼리는 전체 테이블 대상으로 조건에 충족하는 모든 결과 값을 검색하게 되므로 처음 쿼리에 비해서 느릴 수 밖에 없습니다. 

 

올려주신 실행 계획을 보니 register_date 조건에 의해서 총 104,783건의 데이터를 대상으로 범위 검색을 하게 되어 있네요.

 

검색 대상 범위를 더 줄이거나 가능하면 실행 속도가 느린 OR 조건 및 LIKE 연산을 쓰지 않도록 하셔야 할 듯 보이네요 ^^

김대웅(pugumer)님이 2011-02-23 18:20에 작성한 댓글입니다.
이 댓글은 2011-02-23 18:23에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
29916memcached 적용한 mysql서버 [1]
돌머리
2011-02-21
9393
29915날짜 테이블 생성!! [1]
ㅇㅇ
2011-02-18
15734
29914저장된 Table에 특정 칼럼 값만 추출하는 쿼리... ㅠ [1]
김혁진
2011-02-18
8453
29913count 쿼리 속도가 너무 차이가 나서요... [3]
이승예
2011-02-17
10985
29911left outer join 에 관한 질문입니다. [1]
하하
2011-02-16
9861
29910array가 값옆에 붙어나오는 문제
JS
2011-02-14
8086
29909조건에 해당하지 않을경우 0 이나 null로 나타내기 [1]
김동명
2011-02-11
8276
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.054초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다