標籤:

MySQL查詢類型不正確不使用索引?

資料庫欄位a是varchar型,對a欄位單獨建立了索引。

a欄位可能是數字型的字元串,如"12345"

使用下面兩條SQL查詢,結果第一條能使用a欄位的索引,第二條不能,請問MySQL內部是什麼機制導致第二條未能使用索引

1. SELECT * FROM `mytable` WHERE `a`=12345

2. SELECT * FROM `mytable` WHERE `a`=12345

MySQL版本5.5.8


出現了數據類型的轉換,第二條SQL語句會導致MySQL資料庫會把a欄位的類型轉換為12345這個數字的整型,詳細的文章可以見:

文章:SQL優化篇:數據類型隱形轉換的危害

鏈接地址:http://www.mysqlops.com/2011/08/26/sql-convert-type.html


資料庫開發基本知識點之一。數據類型隱式轉換,優化器生成執行計劃會有問題。


正如 Fenng 所說,數據類型的隱式轉換可能會影響到資料庫的優化器對執行計劃的選擇。

但這也並非是必定的,要看隱式轉換髮生在哪個地方。

如果隱式轉換髮生在傳入的值上面,就並不會影響到優化器對執行計劃的選擇。

相反,如果隱式轉換髮生在數據表欄位(也就是資料庫中的數據)上,則必定會影響到優化器對執行計劃的選擇,因為這就相當與需要先對數據表中數據通過一個函數對數據類型進行轉換,在這樣的情況下,除非你有一個在該欄位上有該函數索引,否則必定會影響性能。


@mysqlops

隱形轉換導致索引不可用,那麼就是全表掃描了..

奇怪了,我剛才建立一個表,為什麼兩種方式同樣都能夠使用索引呢?

從KEY這個值反映出兩個搜索方式,都同時使用了索引index_a

區別只是連接類型type,使用字元串的方式匹配,比數字的方式更優而已

為什麼呢?挺困惑的


開發中不應該存在這種問題才對,既然`a`欄位類型是varchar,拼裝的sql勢必要有單引號`a`=123456,否則`a`=abc時就出錯了,如果是數字不帶引號,字元帶引號的話,`a`=012345時得到的肯定不是你要的結果


推薦閱讀:

專精 Oracle 還是 MySQL?
MySQL成勒索新目標 數據服務基線安全問題迫在眉睫
mysql如何實現四大隔離級別的?
誰殺死了 MySQL? - 後記

TAG:MySQL | 索引 |