隔週連載groonga

第6回 [実録] MySQL向け全文検索エンジン「Tritonn」から「mroonga」への移行ガイド(1)

この記事を読むのに必要な時間:およそ 6 分

Tritonnからmroongaへ移行する7つのメリット

それでは早速,Tritonnからmroongaヘ移行するメリットを見てみましょう。

MySQL 5.6対応であること

もはやレガシーとなったMySQL 5.0という縛りがなくなることで,MySQL 5.1以降の先進的な機能を取り入れることができます。特にMySQL 5.6ではその進化が甚だしく,次の点を始めとする新機能が利用できます。

  • CPUスケーラビリティの向上
  • サブクエリを始めとするオプティマイザの最適化
  • GTIDを利用したフェイルオーバー
  • memcached API対応
  • より詳細な情報は次の記事を参照ください。

    参照ロックフリー

    ストレージモードでは,groongaの性能特性をフルに活かした高速なデータ更新・全文検索・位置情報検索が可能となります。

    ストレージエンジンにInnoDBを利用できること

    mroongaのラッパーモードを利用すれば,全文検索機能に関してはmroongaが担い,それ以外を別のストレージエンジンに委ねることもできます。これはつまり,歴史が長く信頼性の高いInnoDBといったストレージエンジンが使えるということです。

    InnoDBの主な特徴としては次の通りです。

    • トランザクション対応である
    • クラッシュセーフである
    • 更新と参照が入り乱れた場合の同時実行性能が良い

    MySQL 5.1以降からの大幅な性能向上を果たしたInnoDBが使えるというだけでも,mroongaを導入する価値があります。

    プラガブルストレージエンジンである

    アップデートが容易なプラガブルストレージエンジン,つまりプラグイン形式であることもメリットの一つです。TritonnのようなMySQLのソースに手を入れるパッチ形式ではないため,MySQL本体のバージョンアップが容易です。

    bigram以外の豊富なN-gramトークナイザが利用可能

    Tritonnではmecab,bigramとdelimited(空白区切り)のみの対応でした。mroongaではそれだけでなく,uni-gram,tri-gramの他,多数の派生N-gramでのトークナイズに対応しています。

    デフォルトはparser "TokenBigram"が指定されているものとして動作しますが,次のように指定することもできます。

    CREATE TABLE search (
      id INT PRIMARY KEY AUTO_INCREMENT,
      content VARCHAR(255),
      FULLTEXT INDEX (content) COMMENT 'parser "TokenUnigram"'
    ) ENGINE=mroonga DEFAULT CHARSET=utf8;
    

    より強化された文字列正規化機能が利用可能

    Tritonnでは,MySQLが提供するcollate(照合順序)と呼ばれる文字列正規化機能がデフォルトで働いており,NO NORMALIZEと指定することで無効化される挙動でした。

    mroongaでは全文検索機能を完全に外部で持つため,指定のない場合にはgroonga独自のnormalizer(NormalizerAuto)を利用します。これは,大文字・小文字だけでなく,全角・半角を同一視できるというUnicodeのNFKCを用いたとても便利な機能です。

    しかしながら,これまで同様の正規化機能が必要な場合には,別途groonga-normalizer-mysqlパッケージをインストールの上,次のようにインデックスコメントにて,COMMENT 'normalizer "NormalizerMySQLGeneralCI"'のように指定しましょう。

    CREATE TABLE search (
      id INT PRIMARY KEY AUTO_INCREMENT,
      content VARCHAR(255),
      FULLTEXT INDEX (content) COMMENT 'normalizer "NormalizerMySQLGeneralCI"'
    ) ENGINE=mroonga DEFAULT CHARSET=utf8;
    

    より具体的な挙動の違いに関しては,groonga/mroongaの文字列正規化機能 (normalizer) の挙動を追ってみるの記事が参考になります。

    位置情報検索に対応

    mroongaのストレージモード・ラッパーモード共に,SPATIAL INDEXに対するMBRContains関数を用いた位置情報検索に対応しています。ストレージモードであればPOINT型を,InnoDBラッパーモードであればGEOMETRY型を指定します。

    テーブルのスキーマは次のように定義します。

    -- ストレージモードでは,POINT型を指定する
    CREATE TABLE shops (
      id INT PRIMARY KEY AUTO_INCREMENT,
      name VARCHAR(255),
      location POINT NOT NULL,
      SPATIAL INDEX (location)
    ) ENGINE = mroonga;
    
    -- InnoDBラッパーモードでは,GEOMETRY型を指定する
    CREATE TABLE shops (
      id INT PRIMARY KEY AUTO_INCREMENT,
      name TEXT,
      location GEOMETRY NOT NULL,
      SPATIAL INDEX location_index (location)
    ) ENGINE = mroonga comment = 'engine "innodb"';
    

    データの登録・検索は次のように行います。

    -- データの登録例
    -- GeomFromText()関数を利用し,文字列からPOINT型に変換します
    INSERT INTO shops VALUES (null, 'Naniwaya', GeomFromText('POINT(139.796234 35.730061)'));
    
    -- データの検索例
    -- 池袋駅(139.7101 35.7292)を左上の点,東京駅(139.7662 35.6815)を右下の点とした長方形内にあるお店を探す場合のクエリです
    SELECT id, name, AsText(location) AS location_text FROM shops
      WHERE MBRContains(GeomFromText('LineString(139.7101 35.7292, 139.7662 35.6815)'), location);
    

    ただし,データとして格納できるのはPOINT(GEOMETRY)型のみで,LINEなどの他のデータ型は保存できないという制約があります。また,MBRDisjointなどにも対応していません。GEOMETRY型についての詳細は,第5回 位置情報を保存しよう(前編⁠⁠:位置情報サービスのはじめ方が参考になります。

    汎用的に矩形での位置情報検索をするなら,B-Treeを用いた前方一致探索のできるGeoHashという手法があります。このGeoHashの具体的な使い方に関しては,第6回 位置情報を保存しよう(後編⁠⁠:位置情報サービスのはじめ方が参考になります。

    移行する際に気をつけたいポイント

    ストレージモードとラッパーモード

    ストレージモードとは,MySQLのデータベースを利用せずに,groongaのデータベースに全データを格納して利用するモードです。参照ロックフリーの恩恵を受けられるなどのメリットは多くありますが,データ型は厳密にMySQLと同一の挙動を示すわけではありません。

    そういった事情もあり,私としてはTritonnからの移行を行うなら,ラッパーモードの利用をお勧めしたいです。

    ラッパーモードで使うストレージエンジン

    COMMENT='engine "innodb"'のように,テーブルのスキーマにて指定ができます。次のサンプルではinnodbを指定していますが,myisamなど,どんなストレージエンジンの利用も可能です。

    CREATE TABLE search (
      id INT PRIMARY KEY AUTO_INCREMENT,
      content VARCHAR(255),
      FULLTEXT INDEX (content)
    ) ENGINE=mroonga DEFAULT CHARSET=utf8 COMMENT='engine "innodb"';
    

著者プロフィール

吉田健太郎(Kentaro Yoshida)

株式会社リブセンス,Web系インフラの研究開発エンジニア。

ITベンチャー立ち上げに参画し,幅広い領域での経験を積むこと8年目。フルスタックエンジニアを目指して,湧き出るアイディアを形にする日々を過ごしている。

GitHub:https://github.com/y-ken/
ブログ:http://y-ken.hatenablog.com/