전체 텍스트 검색과 파티션

x·2023년 2월 25일
0

DB

목록 보기
2/7

전체 텍스트 검색

개요

전체 텍스트 검색은 긴 문자로 구성된 구조화되지 않은 텍스트 데이터를 빠르게 검색하기 위한 기능

긴 텍스트를 구성하는 각 단어에 대해 인덱스를 적용하는 것이 전체 텍스트 검색임

전체 텍스트 인덱스(FULLTEXT Index)

전체 텍스트 인덱스 생성

일반적 인덱스와 차이가 있다

  • InnoDB, MyISAM 테이블만 지원
  • char, varchar, text 타입 열에만 생성 가능
  • 인덱스 힌트의 사용이 일부 제한됨
  • 여러 개의 열에 FULLTEXT 인덱스를 지정할 수 있음

중지 단어

검색에서 무시할 단어들은 인덱스로 생성하지 않는 게 좋음.
INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD 테이블에 기본 중지 단어가 있음

중지단어 등록 방법
value 열, varchar 타입은 약속임
create table stopword (value varchar(30));
insert into stopword values('');
set global innodb_ft_server_stopword_table = 'fulltextdb/stopword';

전체 텍스트 검색을 위한 쿼리

전체 텍스트 인덱스를 이용하기 위해 where절에 match() against()를 사용하면 됨

입력된 word의 정확한 단어만 검색됨. 또는 조건을 걸려면 against에 띄어쓰기로 단어를 구분해주면 됨.
select * from {table} where match({column}) against({word});

불린 모드 검색
단어나 문장이 정확히 일치하지 않아도 검색됨
IN BOOLEAN MODE 옵션을 붙여야 함
필수 +, 제외 -, 부분 검색 * 등 연산자 지원

다음과 같이 검색하면 영화가 앞에 들어간 단어가 들어간 결과가 검색됨
select * from {table} where match({column}) against('영화*' IN BOOLEAN MODE);

다음과 같이 검색하면 정확히 영화 배우라는 단어가 들어간 결과가 검색됨
select * from {table} where match({column}) against('영화 배우' IN BOOLEAN MODE);

다음과 같이 검색하면 영화 배우라는 단어가 들어간 텍스트에서 공포가 들어간 결과가 검색됨
select * from {table} where match({column}) against('영화 배우 +공포' IN BOOLEAN MODE);

다음과 같이 검색하면 영화 배우라는 단어가 들어간 텍스트에서 남자가 없는 결과가 검색됨
select * from {table} where match({column}) against('영화 배우 -남자' IN BOOLEAN MODE);

파티션

테이블을 물리적으로 여러 개의 테이블로 쪼개는 것
대용량 DB를 분산 저장해서 효율화하기 위함
mysql 8.0은 최대 8192개의 파티션을 지원함. 파티션을 나누면 물리적으로는 파일이 분리됨.

테이블을 생성할 때 파티션 키를 지정하는데 데이터 입력 시 지정된 파티션 키에 의해 데이터가 각각의 파티션에 입력됨

생일 기준으로 파티션이 나뉘어 저장됨

partition by range(birthday) (
	partition part1 values less than (1971),
    partition part1 values less than (1979),
	partition part1 values less than maxvalue,
);

파티션 분할

alter table partTBL
	reorganize partition part3 into (
    	partition part3 values less than (1986),
        partition part4 values less than maxvalue
    );
optimize table partTBL; // 적용

파티션 합치기

alter table partTBL
	reorganize partition part1, part2 into (
    	partition part12 values less than (1979)
    );
optimize table partTBL; // 적용

레인지 파티션은 숫자형의 연속된 범위를 파티션 키로 지정.
리스트 파티션은 숫자형 또는 문자형의 연속되지 않은 하나하나씩 파티션 키를 지정.

파티션 테이블에 외래 키를 설정할 수 없음

출처 이것이 mysql이다

0개의 댓글