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

MySQL 單引號導致索引失效:性能相差 100 倍實測

     編輯:MySQL 資料庫相關知識

字符類型主鍵查詢時,條件值加不加單引號決定是否走索引。實測 30 萬行數據,性能相差百倍。

實測場景

CREATE TABLE `foo` (
  `key` VARCHAR(10) NOT NULL,
  `time` INT(11) NOT NULL,
  PRIMARY KEY (`key`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- 插入 30+ 萬行測試數據

性能對比

查詢語句耗時EXPLAIN 類型
SELECT * FROM foo WHERE `key` = 12933227970.1288sALL(全表掃描)
SELECT * FROM foo WHERE `key` = '1293322797'0.0009sconst(主鍵查找)

根本原因:隱式類型轉換

  • 無引號:數字 1293322797 與字符串列比較 → MySQL 將列值隱式轉換為數字 → 索引失效 → 全表掃描
  • 有引號:字符串 '1293322797' 與字符串列比較 → 類型一致 → 走主鍵索引

範圍查詢同樣受影響

WHERE `key` > 1293322797    -- 全表掃描
WHERE `key` > '1293322797'  -- 走索引

INT 類型不受影響

將 key 改為 INT 後,加不加引號均走索引,僅 key_len 不同。

最佳實踐鐵律

  1. 永遠給字符串值加單引號,無論數字外觀如何
  2. 應用層參數綁定自動處理類型(Prepared Statement)
  3. 代碼審查檢查點:WHERE 條件中字符串列比較值必須帶引號
  4. 工具輔助:pt-query-digest 分析慢查詢發現隱式轉換
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved