×××数値と文字列の数値のインデックス使用状況


文の準備:
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は数字を×××文字列との自動変換!次の2つの文の結果は同じです:SELECT*FROM ix_test WHERE id_1=1;SELECT * FROM ix_test WHERE id_1='1';
しかしインデックスの使用状況では、結果は全く違います!1つ目はインデックスを使用しません.2つ目はインデックスを使用します.
2つの文、1つ目はインデックスを使用していますが、全テーブルをスキャンし、2つ目はデータに直接インデックスし、1行だけ読み込む必要があります.
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の後のフィールドタイプが文字列の数字である場合、×××一致しない(引用符で数字を引用しない)場合は、インデックスから直接命中することはできません.すべてのスキャンが必要です.
特に注意が必要!