티스토리 뷰

반응형

1. 현상

   : 리스트 로딩 시 검색어가 추가되면 속도가 많이 느렸다. 답답이....

     검색어가 총 3개의 테이블을 검색하는 것이지만 너무 느린감이 있어서 튜닝에 나섰다.

 

2. 원인

    : 처음 쿼리가 이랬다... SELECT 소요 시간은 2.17초 정도

	
    
    SELECT ... FROM 테이블1
    WHERE
    	INSTR(컬럼1_테이블1, '검색어') > 0
        OR PK_테이블1 IN (
        	SELECT FK_테이블2 FROM 테이블2 WHERE INSTR(컬럼2_테이블2, '검색어') > 0
            UNION
            	SELECT FK_테이블3 FROM 테이블3 WHERE INSTR(컬럼3_테이블3, '검색어') > 0
        )
        
        

 

    - 검색어를 검색할 때 INSTR 함수를 사용했는데 이 부분을 LIKE 문으로 바꾸자 속도가 개선되었다.

      검색어 검색 시에는 INSTR 보다 LIKE 문을 사용하는 게 낫다고 한다. (아래 사이트 참고)

http://database.sarang.net/?inc=read&aid=29513&criteria=mysql&subcrit=&id=24355&limit=20&keyword=lqez&page=16 

http://www.gurubee.net/article/66827

 

    - 그러나 더 큰 문제는 UNION이었다 ㅠㅠ

      UNION을 사용하면 속도가 많이 떨어지기 때문에 UNION을 꼭 사용해야 하는 경우에는 필요한 최소 컬럼만 검색해야 한다고 한다. 되도록 사용하지 않는 것이 좋다고 한다.

      (아래 사이트에 UNION과 UNION ALL에 대한 상세한 설명이 있다.)

http://intomysql.blogspot.com/2011/01/union-union-all.html

      

3. 개선된 쿼리

     : SELECT 소요 시간이 1초 근방으로 바뀌었다.

	
    
    SELECT ... FROM 테이블1
    WHERE
    	컬럼1_테이블1 LIKE CONCAT('%', '검색어','%')
        OR PK_테이블1 IN (
        	SELECT FK_테이블2 FROM 테이블2 WHERE 컬럼2_테이블2 LIKE CONCAT('%', '검색어','%')
        ) OR PK_테이블1 IN (
            	SELECT FK_테이블3 FROM 테이블3 WHERE 컬럼3_테이블3 LIKE CONCAT('%', '검색어','%')
        )
        
        

 

 

 

반응형

'DB > mariadb | mysql' 카테고리의 다른 글

공백문자와 탭문자 제거  (0) 2021.11.10
[mysql] Trigger 생성, 삭제  (0) 2020.07.06
/*!40100 ... */ 주석문  (0) 2019.06.11
Out of range value for column  (0) 2018.12.31
[mysql] 연결된 테이블 확인  (0) 2018.08.05
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함