Giới thiệu
Sử dụng chỉ mục FULLTEXT và MATCH() ... AGAINST() để tìm kiếm văn bản nhanh chóng trên cột TEXT/VARCHAR lớn.
1. Tạo bảng
mysql> create table DemoTable1554 (
-> Title text
-> );
Query OK, 0 rows affected (0.63 sec)
2. Tạo chỉ mục FULLTEXT
mysql> create fulltext index faster_title on DemoTable1554(Title); Query OK, 0 rows affected, 1 warning (7.09 sec) Records: 0 Duplicates: 0 Warnings: 1
3. Chèn dữ liệu
mysql> insert into DemoTable1554 values('John is working on MySQL database');
Query OK, 1 row affected (0.26 sec)
mysql> insert into DemoTable1554 values('Adam Smith is working on Java language');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1554 values('John smith is working on Python Language');
Query OK, 1 row affected (0.17 sec)
4. Dữ liệu gốc
mysql> select * from DemoTable1554;
+------------------------------------------+ | Title | +------------------------------------------+ | John is working on MySQL database | | Adam Smith is working on Java language | | John smith is working on Python Language | +------------------------------------------+ 3 rows in set (0.00 sec)
5. Tìm kiếm từ khóa "language" (boolean mode)
mysql> select * from DemoTable1554
-> where match(Title) against('language' in boolean mode);
6. Kết quả
+------------------------------------------+ | Title | +------------------------------------------+ | Adam Smith is working on Java language | | John smith is working on Python Language | +------------------------------------------+ 2 rows in set (0.00 sec)
Ưu điểm FULLTEXT vs LIKE:
| Đặc điểm | LIKE '%term%' | FULLTEXT |
|---|---|---|
| Tốc độ bảng lớn | Rất chậm (full scan) | Nhanh (index) |
| Hỗ trợ từ ngữ | Không | Có (stemming, stopwords) |
| Boolean operators | Không | Có (+, -, *, "") |
| Điểm liên quan (relevance) | Không | Có |
| Khoảng trắng/ngôn ngữ | Không xử lý | Có parser |
Lưu ý: Từ khóa quá ngắn (mặc định < 4 ký tự) bị bỏ qua. Cấu hình ft_min_word_len.