首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 單表多關鍵字多字段模糊查詢:CONCAT 合併索引法

     編輯:MySQL 資料庫相關知識

需求:用戶輸入多個關鍵字(空格分隔),需在 title、tag、description 三字段中任意組合匹配所有關鍵字。

方案對比

方案優點缺點
多字段 OR LIKE邏輯直觀無法保證所有關鍵字都出現
新增合併字段查詢簡單冗余存儲、維護成本高
全文索引專業搜索中文分詞複雜、FT 最小 4 字節限制
CONCAT 即時合併零存儲成本、邏輯精確無法利用索引、大表性能差

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);

邏輯:每個關鍵字必須在三字段合併後的字符串中出現。

性能優化建議

  • 小/中表(<10萬行):直接可用
  • 大表:必須 新增合併字段 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);
  • MySQL 8.0+ 可用生成列(Generated Column)自動維護

避坑指南

  • CONCAT 任一參數為 NULL 會導致結果為 NULL → 用 COALESCE(col, '') 防護
  • LIKE '%...%' 導致全表掃描,大數據量慎用
  • 高頻搜索建議接入 Elasticsearch/Meilisearch
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved