티스토리 뷰
반응형
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://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 |