1. 程式人生 > >整形數字和字串數字的索引使用情況

整形數字和字串數字的索引使用情況

http://imysqldba.blog.51cto.com/1222376/1277307

準備語句:

1 2 3 4 5 DROP TABLE ix_test; CREATE TABLE ix_test (id_1 varchar(20) NOT NULL, PRIMARY KEY(id_1)); INSERT INTO ix_test VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11);

mysql會將數字在整形和字串之間自動轉換!
這樣下面兩條語句的結果是一樣的:
SELECT * FROM ix_test WHERE id_1=1;
SELECT * FROM ix_test WHERE id_1='1';

但是在索引使用情況方面,結果就完全不一樣了!第一條不使用索引,第二條使用索引!

兩條語句,第一條使用了索引,但是掃描了全表,第二條直接索引到資料,只需要讀取一行!

1 2 3 4 5 6 7 8 9 10 11 12 13 14 mysql> explain select from ix_test where id_1=1; +----+-------------+---------+-------+---------------+---------+---------+------+------+--------------------------+
| id | select_type | table   | type  | possible_keys | key     | key_len | ref  | rows | Extra                    | +----+-------------+---------+-------+---------------+---------+---------+------+------+--------------------------+ |  1 | SIMPLE      | ix_test | index PRIMARY       PRIMARY
 | 302     | NULL |   11 | Using where; Using index | +----+-------------+---------+-------+---------------+---------+---------+------+------+--------------------------+ 1 row in set (0.00 sec) mysql> explain select from ix_test where id_1='1'; +----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+ | id | select_type | table   | type  | possible_keys | key     | key_len | ref   | rows | Extra       | +----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+ |  1 | SIMPLE      | ix_test | const | PRIMARY       PRIMARY | 302     | const |    1 | Using index | +----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+ 1 row in set (0.01 sec)

但是如果將id_1欄位變為整形,後面用整形或者是字串去匹配都可以使用索引,而且索引直接命中!

所以,多麼坑爹的mysql sql優化器,多麼痛的領悟!

得出結論,對於where後面欄位型別為字串的數字,如果用整形去匹配(就是不用引號引上數字),則不能由索引直接命中,需要全部掃描。

特別需要注意!