SELECT * FROM t WHERE col LIKE '%kw%' 在大數據量下全表掃描,效率極低,且無法按相關性排序。
FULLTEXT 索引。MATCH(col) AGAINST('keyword') 查詢,MySQL 自動按相關性降序返回。CREATE TABLE reviews ( id INT(5) PRIMARY KEY NOT NULL AUTO_INCREMENT, data TEXT );
INSERT INTO reviews (data) VALUES
('Gingerboy has a new single out called Throwing Rocks. It\'s great!'),
('Hello all, I really like the new Madonna single. One of the hottest tracks...'),
('Have you heard the new band Hotter Than Hell? They burn instruments on stage!');
ALTER TABLE reviews ADD FULLTEXT INDEX (data);
SHOW INDEXES FROM reviews; +--------+------------+----------+--------------+-------------+-----------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Index_type | +--------+------------+----------+--------------+-------------+-----------+ | reviews| 0 | PRIMARY | 1 | id | BTREE | | reviews| 1 | data | 1 | data | FULLTEXT | +--------+------------+----------+--------------+-------------+-----------+
-- 自然語言模式(預設),按相關性排序
SELECT * FROM reviews
WHERE MATCH(data) AGAINST('new single');
-- 布爾模式,支援 + - * 等操作符
SELECT * FROM reviews
WHERE MATCH(data) AGAINST('+new -Madonna' IN BOOLEAN MODE);
注意:MySQL 5.6+ 才支援 InnoDB 全文索引;早期版本僅 MyISAM。中文分詞需配合 ngram parser 或外部分詞工具。