Real MariaDB (2017년)
MROONGA 전문 검색 스토리지 엔진 0 0 50,043

by 구루비스터디 MariaDB 스토리지 엔진 MROONGA 전문 검색 스토리지 엔진 MROONGA [2019.08.11]


6.9 Mroonga 전문 검색 스토리지 엔진

  • 일본 DeNA 에서 개발한 컬럼 기반 전문 검색 엔진
  • 두가지 실행 모드 : 스토리지 엔진 / 래퍼(Wrapper) - 실제 데이터는 InnoDB 스토리지 엔진에 저장하고 검색용 전문 인덱스만 Mroonga 스토리지 엔진에 저장


스토리지 모드래퍼 모드


6.9.1 인덱스 알고리즘

6.9.1.1 구분자(Stopword) 방식
  • 공백, 탭, 띄어쓰기, 마침표 같은 문장 기호, 한국어의 조사 등을 구분자 목록에 정의 하고, 구분자를 이용하여 키워드를 분석 후 인덱스 생성
  • 매우 자주 씌이는 단어를 구분자에 넣기 도 함
  • MySQL 내장 전문 검색 엔진 채택 방식


6.9.1.2 n-Gram 방식
  • 전문을 무조건적으로 몇 글자씩 잘라서 인덱싱
  • 인덱싱 알고리즘이 복잡하고, 인덱스가 상대적으로 큼
  • 2-Gram(Bi-Gram) 많이 사용


6.9.1.3 구분자와 n-Gram의 차이

SELECT * FROM tb_test WHERE MATCH(doc_body) AGAINST ('아이폰' IN BOOLEAN MODE);


doc_body구분자n-Gram
중고 아이폰 3G 팝니다.OO
아이폰 3Gs 구해 봅니다.OO
애플아이폰 3Gs 싸게 팝니다.XO


6.9.2 Mroonga 전문 검색 엔진 설치


INSTALL PLUGIN mroonga SONAME 'ha_mroonga.so';
CREATE FUNCTION last_insert_grn_id RETURNS INTEGER SONAME 'ha_mroonga.so';
CREATE FUNCTION mroonga_snippet RETURNS STRING SONAME 'ha_mroonga.so';


6.9.3 Mroonga 전문 검색 엔진 사용


create table tb_test (
  id int primary key auto_increment,
  content varchar(255),
  fulltext index fx_content (content) comment 'parser "TokenBigramIgnoreBlankSplitSynbolAlphaDigit"'
) ENGINE = mroonga COMMENT = 'engine "innodb"' DEFAULT CHARSET utf8mb4;

INSERT INTO TB_TEST (CONTENT) VALUES ('오늘은 MariaDB 공부를 했습니다. 내일도 MariaDB 공부를 할 것입니다.");
INSERT INTO TB_TEST (CONTENT) VALUES ('오늘은 MariaDB 공부를  했지만, 내일은 MariaDB 공부를 할 것입니다.");

SELECT *, MATCH (content) AGAINST ('MariaDB' IN BOOLEAN MODE) AS SCORE
  FROM tb_test
 WHERE MATCH (content) AGAINST ('MariaDB' IN BOOLEAN MODE)  
 ORDER BY MATCH (content) AGAINST ('MariaDB' IN BOOLEAN MODE)  DESC;



TokuDB

  • Fractal Tree 기반의 스토리지 엔진
  • 온라인 DDL 기능 제공
  • Fractal Tree 및 압축 효율로 Disk I/O 를 효과적으로 줄여서 Insert 성능 좋음



HandlerSocket

  • DeNA 에서 개발한 단순 읽기 최적 플러그인
  • 파싱/옵티마이즈 단계를 없애고 Handler API 직접 호출 하는 방식
  • Primary Key 로만 데이터 접근 하는 경우와 같이 단순한 쿼리라면 파서/옵티마이저 단계가 오버헤드일 수 있음



쓰기 성능


읽기 성능


FederatedX

  • 원격 데이터베이스 내 테이블을 로컬에 있는 것 처럼 접근 가능
  • 2-Phase Commit 일관성 제공
  • 테이블 파티션 별 다른 서버 연결 가능

create server 'remote' foreign data wrapper 'mysql' options
(host 'remote',
database 'target_db',
user 'appuser',
password 'passwd123',
port 3306,
socket ''
owner 'appuser');

SELECT * FROM mysql.servers;

-- 원격/로컬 이름이 같음
create table tb_remote (
 col01 bigint(20) not null,
 col02 bigint(20) not null,
 col03 varchar(20) not null default '',
 primary key (col01)
) engine = federated connection = 'remote';

-- 원격/로컬 이름이 다름
create table tb_local (
 col01 bigint(20) not null,
 col02 bigint(20) not null,
 col03 varchar(20) not null default '',
 primary key (col01)
) engine = federated connection = 'mysql://appuser:passwd123@remote:3306/target_db/tb_remote';

"구루비 데이터베이스 스터디모임" 에서 2017년에 "Real MariaDB" 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/4208

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입