首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL LIKE 查詢效能測試:百分號數量不影響執行速度,多條件拆分更優

     編輯:MySQL 綜合教學

MySQL LIKE 查詢效能測試:百分號數量不影響執行速度,多條件拆分更優

常見迷思:LIKE '%abc%def%' 中百分號越多越慢?實測證明:百分號數量不影響執行速度,關鍵在於前導百分號導致全表掃描與條件寫法。本文呈現實測數據與優化建議。

實測環境

  • 表:goods,約 10 萬行
  • 欄位:goods_name VARCHAR(200),無索引(前導 % 無法用索引)
  • 條件:stime/etime 時間範圍過濾,flag 排序

三組測試語句與耗時

#SQL 寫法耗時 (秒)說明
1WHERE goods_name LIKE '%iPhone%iPod%'0.0489 / 0.0691 / 0.0485 / 0.0467單 LIKE 多個關鍵字
2WHERE goods_name LIKE '%iPhone%' AND goods_name LIKE '%iPod%'0.0460 / 0.0430 / 0.0493 / 0.0783 / 0.0496多 LIKE 條件 AND 連接(推薦)
3WHERE goods_name LIKE '%%%%%%%%%iPhone%iPod%%%%%%%%%'0.0458 / 0.0441 / 0.0449大量百分號(無影響)

結論

  1. 百分號數量不影響速度:MySQL 內部正則/模式匹配引擎處理 % 為「任意長度字符」,多個連續 % 自動合併優化
  2. 多條件 AND 拆分略優:LIKE '%a%' AND LIKE '%b%' 允許優化器短路求值(先匹配選擇率高的),單 LIKE '%a%b%' 需完整匹配模式
  3. 前導 % 導致全表掃描:無論多少百分號,LIKE '%xxx' 無法使用 B+樹索引,必須全表掃描
  4. 優化建議

    場景方案效果
    固定前綴搜尋LIKE 'prefix%'可用索引範圍掃描,極快
    全文搜尋需求MySQL 5.6+ FULLTEXT INDEX + MATCH() AGAINST()倒排索引,支援自然語言/布爾模式
    高並發模糊搜尋Elasticsearch / Solr 外掛專業搜尋引擎,分詞、評分、高亮
    小表/低頻查詢前導 % 全表掃描可接受資料量 <10萬、QPS 低時無需優化

    索引條件下推 (ICP) 5.6+

    若有複合索引 (stime, etime, goods_name),且查詢 WHERE stime < ? AND etime > ? AND goods_name LIKE '%xxx%',ICP 會在儲存引擎層過濾 goods_name,減少回表次數,但前導 % 仍無法用索引查找,僅能過濾已讀取的行。

    最佳實踐建議

    1. 優先用多條件 AND 拆分:LIKE '%a%' AND LIKE '%b%'
    2. 避免前導 %:業務允許時改為前綴匹配或全文索引
    3. 大表必上搜尋引擎:ES 解決模糊搜尋、分詞、同義詞、評分
    4. EXPLAIN 驗證:確認 type=ALL (全表掃描) vs type=range/ref (索引)
    百分號數量是偽議題,前導百分號才是效能殺手。寫法上 LIKE '%a%' AND LIKE '%b%' 優於 LIKE '%a%b%',但根治之道在於「不讓前導 % 落在大表上」—— 用索引、用全文、用 ES。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved