MySQL 表格欄位是 CHAR 或 VARCHAR 時,寫搜尋條件要記得使用 string 格式,而非數字。意思是,要避免這種 SQL query:
SELECT * FROM foo WHERE `column_string` = 123456;
原因是即使 column_string 加上了 B-tree index,也無法利用這個 index 加速查詢。
原因是,除了最明確的 '123456'
會符合外,還有很多種 case 符合:
mysql> SELECT 123456 = '0123456'; +--------------------+ | 123456 = '0123456' | +--------------------+ | 1 | +--------------------+ 1 row in set (0.00 sec) mysql> SELECT 123456 = ' 123456'; +--------------------+ | 123456 = ' 123456' | +--------------------+ | 1 | +--------------------+ 1 row in set (0.00 sec)
這使得 index 無用武之地。
但如果欄位本身是數字 (INT/BIGINT),搜尋時用字串反而沒關係:MySQL 會先把字串轉型為數字再比較,所以會用到 index。
總而言之:
- 可以用 INT/BIGINT 時,不要用 CHAR/VARCHAR 儲存。
- 使用 CHAR/VARCHAR 的欄位當搜尋條件時,要用字串形式當作搜尋條件。(除非你很清楚你在做什麼)
今天上場當救援投手時解掉的問題...