字符類型主鍵查詢時,條件值加不加單引號決定是否走索引。實測 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` = 1293322797 | 0.1288s | ALL(全表掃描) |
SELECT * FROM foo WHERE `key` = '1293322797' | 0.0009s | const(主鍵查找) |

1293322797 與字符串列比較 → MySQL 將列值隱式轉換為數字 → 索引失效 → 全表掃描'1293322797' 與字符串列比較 → 類型一致 → 走主鍵索引WHERE `key` > 1293322797 -- 全表掃描
WHERE `key` > '1293322797' -- 走索引
將 key 改為 INT 後,加不加引號均走索引,僅 key_len 不同。

pt-query-digest 分析慢查詢發現隱式轉換