DB

[Mysql] Mysql의 여러가지 검색 기능

develop-Jay ㅣ 2023. 6. 8. 14:35

이건 여러 곳에서 찾아봤겠지만, 많은 자료가 있을테니 간단하게 정리해놓을려고 한다.

 

mysql에서 select를 할 경우 사용할 수 있는 것 위주로 정리하였다.

 

1.   =

select * from <table> where column = '값';

가장 기본적인 검색법으로 컬럼의 값이 찾는 값과 같은 경우의 결과만 찾는다.

 

2. in

select * from <table> where column in ['값1','값2']

in 문법은 [] 안에 값을 가지고 있는 경우의 결과를 찾는다.

 

3. like

select * from <table> where column like '값';
select * from <table> where column like '값%';
select * from <table> where column like '%값';
select * from <table> where column like '%값%';

like 문법은 포함된 값을 찾는다. % 와일드카드를 사용할 경우 찾으려는 문장의 앞과 뒤에 있는 값도 인식한다

첫번째 :  값과 같은경우(=)과 같다.

두번째 : 값으로 시작해서 뒤에 다른 글자가 적혀있어도 인식한다.

세번째 : 끝나는 글자가 값이랑 같을 경우 인식한다.

네번째 : 값이 문장의 어디에 들어있든 인식된다.

 

 

여기까지가 가장 대중적으로 사용하는 방식들이고, 다른곳에서 덜 사용하는 것을 정리해볼려고 한다.

 

4. REGEXP

select * from <table> where column REGEXP '값';
select * from <table> where column REGEXP '값1|값2';

REGEXP 문법은 like 문법과 in 문법의 같이 사용하는 것과 같다.

REGEXP는 여러가지 정규식을 같이 사용할 수 있고, 기본적으로 사용할 경우 위와같이 사용할 수 있다.

기본적으로 와일드카드를 앞과 뒤에 다 사용하는 것과 같이 인식되기에,

 

select * from <table> where column like '%값%';
select * from <table> where column like '%값1%' or column like '%값2%';

와 같다고 볼수있다.

이를 제외하고도 간단한 정규식은 밑에 정리했다.

. : 문자 하나를 나타낸다.
* : 앞에 나온 문자의 0개 이상 반복을 나타낸다.
^ : 문자열의 처음을 나타낸다.
$ : 문자열의 끝을 나타낸다.
[.] : 괄호 안의 문자열 일치를 확인한다.
{.} : 반복을 나타낸다.
| : or 를 나타낸다.

 

 

5. fulltext(풀 텍스트)

이건 찾고 사용하는 시간이 생각보다 걸렸다.

이 검색법을 사용하기 위해서는 기본적으로 InnoDB 엔진, MyISAM 엔진을 사용해야지 사용 가능하다.

 

사용하기위해서는 fulltext index를 추가해야지 사용가능하다.

 

create fulltext index <index> on <table> (<column>);

alter table <table> add fulltext index <index> (<column>)

 만약 테이블이 만들어져있지 않다면 Create로 만들고 기존에 있는 테이블에 추가한다면 alter를 사용하여 추가할 수 있다.

여기까지 추가하면 기본적인 준비는 완료가 되었고, 추가한 인덱스를 확인하고 싶다면,

show index from <table>;

을 사용할 경우 테이블의 인덱스 정보를 확인할 수 있다.

 

fulltext 를 사용하는 방식중에 가장 많이 사용하는 것은 자연어 방식과 boolean 방식이기에 2개만 사용법을 간단하게 남겨본다.

select * from <table> where match(column) against('값1 값2');

자연어 검색은 가장 기본적은 모드로, 위와 같이 사용할 경우 값1 or 값2의 조건으로 검색이 된다.

 

select * from <table> where match(column) against('값1' in boolean mode);
select * from <table> where match(column) against('값1 +값2' in boolean mode);

boolean 방식은 위와같이 뒤에 'in boolean mode'라고 적으면 동작된다 boolean과 같이 특정 조건을 넣기에 좋다.

기본적으로 +는 and , - 제외이고 값의 뒤에 *을 작성 시 와일드 카드 사용이 가능하다.

+, - 방식을 사용할 경우 값에 띄어쓰기없이 사용해야지 동작한다.

값1 -값2 형식이다. 만약 띄어쓰기를 할경우 모두 인식되어 or로 동작될 수 있다.

 

이를 사용하다보면 검색이 안되는 것들이 있다는 것을 알 수 있는데, full text 검색의 글자 수 제한이 있을 가능성이 크다.

full text를 사용할 경우 기본적으로 설정되어 있는 인덱스의 검색 가능 글자수가 있는데,

show variables like '%ft%'

위의 sql문을 사용할 경우 검색 가능 글자수를 확인할 수 있다.

ft_min_word_len, innidb_ft_min_token_size 가 4,3으로 되어있을 것이다.

이는 띄어쓰기 기준으로 문단을 놔누었을때. 4글자가,3글자 이하는 검색이 되지않는다.

그래서 한글자와 2글자까지 검색을 하고 싶다면, 이를 바꿔주어야한다.

 

fulltext를 사용할 경우 문제점은 like와 같이 검색하는 값이 무조건 처음에 나와야된다는 문제가 있다. 이러한 문제를 해결하기 위해서 parser ngram이 추가되었다

**************************

 - parser ngram 

parser ngram은 fulltext 인덱스에 같이 추가해주면 되는 것이고, 이를 추가하면 fulltext의 문제점인 값이 중간에 있는 경우에도 검색이 가능하다.

create fulltext index <index> on <table> (<column>) with parser ngram;

alter table <table> add fulltext index <index> (<column>) with parser ngram;

parser ngram을 사용하더라도 사용법은 똑같다.