需求:用戶輸入多個關鍵字(空格分隔),需在 title、tag、description 三字段中任意組合匹配所有關鍵字。
| 方案 | 優點 | 缺點 |
|---|---|---|
| 多字段 OR LIKE | 邏輯直觀 | 無法保證所有關鍵字都出現 |
| 新增合併字段 | 查詢簡單 | 冗余存儲、維護成本高 |
| 全文索引 | 專業搜索 | 中文分詞複雜、FT 最小 4 字節限制 |
| CONCAT 即時合併 | 零存儲成本、邏輯精確 | 無法利用索引、大表性能差 |
SELECT * FROM `magazine`
WHERE CONCAT(`title`, `tag`, `description`) LIKE '%關鍵字%';
多關鍵字時在應用層拼接:
$keywords = explode(' ', $input);
$conditions = [];
foreach ($keywords as $kw) {
$conditions[] = "CONCAT(`title`,`tag`,`description`) LIKE '%{$kw}%'";
}
$sql = "SELECT * FROM `magazine` WHERE " . implode(' AND ', $conditions);
邏輯:每個關鍵字必須在三字段合併後的字符串中出現。
search_text + 全文索引或前綴索引CREATE TRIGGER before_insert_magazine
BEFORE INSERT ON magazine
FOR EACH ROW
SET NEW.search_text = CONCAT(NEW.title, ' ', NEW.tag, ' ', NEW.description);
CONCAT 任一參數為 NULL 會導致結果為 NULL → 用 COALESCE(col, '') 防護LIKE '%...%' 導致全表掃描,大數據量慎用