Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 | 31 |
Tags
- 코틀린 코루틴의 정석
- kotlin spring
- IntelliJ
- AWS EKS
- Spring
- kotlin
- Elasticsearch
- Java
- Pinpoint
- kotlin coroutine
- minikube
- CKA 기출문제
- CKA
- AI
- 정보처리기사 실기 기출문제
- APM
- 티스토리챌린지
- aws
- MySQL
- Linux
- 정보처리기사실기 기출문제
- 기록으로 실력을 쌓자
- mysql 튜닝
- 오블완
- 공부
- 정보처리기사 실기
- CloudWatch
- Kubernetes
- PETERICA
- kotlin querydsl
Archives
- Today
- Total
피터의 개발이야기
[MySQL 튜닝] INSTR, LIKE, LOCATE, REGEXP 검색 속도 비교 본문
반응형
ㅁ 개요
MySQL의 문자열에서 특정문자열의 검색을 위해서 LIKE 함수를 많이 이용합니다. 상황에 따라서 INSTR이 더 빠른 경우도 있는데, 구체적으로 INSTR, LOCATE, LIKE, REGEXP들의 속도차이가 얼마인지, 다시 말해 상황에 따라 어떤 것이 더 효율적인지 분석한 내용을 정리하였습니다.
ㅁ 테스트 방법
a-z의 문자열에서 처음, 중간, 끝의 문자열 검색 속도를 비교 하기 위해 테스트를 진행하였습니다.
[MySQL] 실습환경 구성하기에서 생성한 MySQL이며, 버젼은 5.7.37입니다.
### INSTR ###
# 16 s 529 ms
SELECT BENCHMARK(50000000,INSTR('abcdefghijklmnopqrstuvwxyz','abc'))
# 1 m 24 s 146 ms
SELECT BENCHMARK(50000000,INSTR('abcdefghijklmnopqrstuvwxyz','mno'))
# 2 m 26 s 420 ms
SELECT BENCHMARK(50000000,INSTR('abcdefghijklmnopqrstuvwxyz','xyz'))
### LOCATE ###
# 5 s 289 ms
SELECT BENCHMARK(50000000,LOCATE('abcdefghijklmnopqrstuvwxyz','abc'))
# 5 s 200 ms
SELECT BENCHMARK(50000000,LOCATE('abcdefghijklmnopqrstuvwxyz','mno'))
# 5 s 282 ms
SELECT BENCHMARK(50000000,LOCATE('abcdefghijklmnopqrstuvwxyz','xyz'))
### LIKE ###
# 22 s 579 ms
SELECT BENCHMARK(50000000,'abcdefghijklmnopqrstuvwxyz' LIKE 'abc%')
# 51 s 136 ms
SELECT BENCHMARK(50000000,'abcdefghijklmnopqrstuvwxyz' LIKE '%mno%')
# 1 m 8 s 679 ms
SELECT BENCHMARK(50000000,'abcdefghijklmnopqrstuvwxyz' LIKE '%xyz')
### REGEXP ###
# 34 s 370 ms
SELECT BENCHMARK(50000000,'abcdefghijklmnopqrstuvwxyz' REGEXP 'abc')
# 1 m 24 s 497 ms
SELECT BENCHMARK(50000000,'abcdefghijklmnopqrstuvwxyz' REGEXP 'mno')
# 2 m 12 s 733 ms
SELECT BENCHMARK(50000000,'abcdefghijklmnopqrstuvwxyz' REGEXP 'xyz')
ㅇ 테스트 진행 시 LOCATE의 문법에 오류가 있다는 것을 발견하였습니다.
The first syntax returns the position of the first occurrence of substring substr
in string str. The second syntax returns the position of the first occurrence of
substring substr in string str:str, starting at position pos.
Returns 0 if substr is not in str.
mysql> SELECT LOCATE('bar', 'foobarbar');
-> 4
mysql> SELECT LOCATE('xbar', 'foobar');
-> 0
mysql> SELECT LOCATE('bar', 'foobarbar', 5);
-> 7
This function is multi-byte safe,
and is case-sensitive only if at least one argument is a binary string.
ㅇ LOCATE('검색 문자', '검색 대상')의 순서를 보정하여 다시 테스트를 진행하였습니다.
### LOCATE ###
# 16 s 718 ms
SELECT BENCHMARK(50000000,LOCATE('abc','abcdefghijklmnopqrstuvwxyz'))
# 1 m 24 s 300 ms
SELECT BENCHMARK(50000000,LOCATE('mno','abcdefghijklmnopqrstuvwxyz'))
# 2 m 26 s 483 ms
SELECT BENCHMARK(50000000,LOCATE('xyz','abcdefghijklmnopqrstuvwxyz'))
ㅁ 속도 지표 분석
속도 지표 분석 | 처음 | 중간 | 끝 |
INSTR | 16.529 | 84.146 | 146.420 |
LOCATE | 16.718 | 84.3 | 146.483 |
LIKE | 22.579 | 51.136 | 68.679 |
REGEXP | 34.370 | 84.497 | 132.733 |
ㅇ 모든 함수가 문자열의 위치가 끝으로 갈 수록 속도가 늦어짐을 알 수 있었습니다.
ㅇ 처음은 INSTR과 LOCATE는 비슷한 성능을 보여주었고, 문자열이 길어지면 속도가 늦어지는 특성이 있었습니다.
ㅇ 문자열이 길어질 수록 LIKE가 포퍼먼스가 있었습니다.
ㅇ REGEXP은 정규식을 이용한 이용한 복잡한 검색 조건을 사용할 수 있겠지만, 단순 문자열 색인에는 포퍼먼스가 떨어졌습니다.
ㅁ 함께 보면 좋은 사이트
반응형
'Database > MySQL' 카테고리의 다른 글
[MySQL] 대용량 샘플 데이터 사용하기 (0) | 2023.08.18 |
---|---|
[MySQL] 참고자료 목록 (0) | 2023.08.11 |
[MySQL] MySQL DB에서 Select 쿼리가 늦어지는 이유 (0) | 2023.08.02 |
[MySQL] InnoDB의 구조와 Caching을 이용한 포퍼먼스 향상에 대한 이해 (0) | 2023.08.01 |
[MySQL] 실습환경 구성하기, Mysql Docker 설치, 5.7 (0) | 2023.07.31 |
Comments