全文検索エンジン senna を導入した際の、index の張り方は少し特殊なので注意が必要。
create fulltext index インデックス名 using NGRAM on テーブル名 (カラム名);
例) create fulltext index idx_fulltext using NGRAM on tablename (body);
ALTER TABLE tablename ADD FULLTEXT idx_fulltext_title USING NGRAM (title), ADD FULLTEXT idx_fulltext_body USING NGRAM (body);
のように、1つのクエリで複数のインデックスを作成しなければならない。
ALTER TABLE tablename ADD FULLTEXT idx_fulltext_title USING NGRAM (title); ALTER TABLE tablename ADD FULLTEXT idx_fulltext_body USING NGRAM (body);
のように、2回のクエリでインデックスを張った場合、最初のインデックス(idx_fulltext_title)は無効になってしまう。
正しく動作するか確認してみる
SELECT * FROM tablename WHERE match(title) against('ほげ'); SELECT * FROM tablename WHERE match(body) against('ほげほげ');
create fulltext index idx_fulltext using NGRAM on tablename(title, body);
上記ように複数カラムにまたがったインデックスを作成する。
正しく動作するか確認してみる
SELECT * FROM tablename WHERE match(title, body) against('ほげ');
mysql> show index from fulltext; +---------+------------+-----------+--------------+--------------+-----------+-------------+----------+--------+------+------------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | +---------+------------+-----------+--------------+--------------+-----------+-------------+----------+--------+------+------------------+---------+ | fulltext| 1 | idx_hoge1 | 1 | hoge1 | A | 30024 | NULL | NULL | | BTREE | | | fulltext| 1 | idx_hoge2 | 1 | hoge2 | NULL | 1 | NULL | NULL | | FULLTEXT,SENNA,N | | | fulltext| 1 | idx_hoge3 | 1 | hoge3 | NULL | 1 | NULL | NULL | | FULLTEXT,SENNA,N | | +---------+------------+-----------+--------------+--------------+-----------+-------------+----------+--------+------+------------------+---------+
Index_type が「FULLTEXT,SENNA,N」であればOK。