萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL VARCHAR 主鍵查詢:加單引號 vs 不加單引號,效能差 100 倍的真相

實測場景

CREATE TABLE `foo` (
    `key` VARCHAR(10) NOT NULL,
    `time` INT(11) NOT NULL,
    PRIMARY KEY (`key`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

插入 30 萬筆測試資料。

對比測試

SQL耗時EXPLAIN 型別
SELECT * FROM foo WHERE `key` = 12933227970.1288 秒ALL(全表掃描)
SELECT * FROM foo WHERE `key` = '1293322797'0.0009 秒const(主鍵查找)

效能差距:約 140 倍!

深度解析:隱式型別轉換導致索引失效

  • 不加引號:MySQL 將字串欄位 key 與數值 1293322797 比較,觸發**隱式轉型**,將 key 每行轉為數值再比較,**導致索引失效**,只能全表掃描。
  • 加引號:字串比字串,型別一致,**直接走主鍵索引**,極速定位。

延伸驗證:範圍查詢同樣受影響

-- 同樣慢:全表掃描
SELECT * FROM foo WHERE `key` > 1293322797;

-- 同樣快:走索引
SELECT * FROM foo WHERE `key` > '1293322797';

最佳實踐鐵律

  1. 字串型欄位(VARCHAR/CHAR/TEXT)查詢條件永遠加單引號。
  2. 數值型欄位(INT/BIGINT/DECIMAL)查詢條件不加引號。
  3. 使用參數化查詢(Prepared Statement)自動處理型別,杜絕手寫 SQL 拼接風險。
  4. 開啟 sql_mode=STRICT_ALL_TABLES 等嚴格模式,盡早發現型別不匹配。

原理補充

MySQL 型別轉換規則:字串與數值比較時,字串轉數值。'abc' = 0 為真。這意味著 WHERE varchar_col = 123 等同於 WHERE CAST(varchar_col AS UNSIGNED) = 123,函數作用在欄位上直接導致索引失效(Index Condition Pushdown 也無法生效)。

copyright © 萬盛學電腦網 all rights reserved