mysqlvarcharint123走索引吗?

database

结论:

当MySQL中字段为int类型时,搜索条件where num="111" 与where num=111都可以使用该字段的索引。
当MySQL中字段为varchar类型时,搜索条件where num="111" 可以使用索引,where num=111 不可以使用索引

验证过程:

    建表语句:

1

2

3

4

5

6

7

8

9

CREATETABLE`gyl` (

  `id` int(11) NOTNULLAUTO_INCREMENT,

  `str` varchar(255) NOTNULL,

  `num` int(11) NOTNULLDEFAULT"0",

  `obj` varchar(255) DEFAULTNULL,

  PRIMARYKEY(`id`),

  KEY`str_x` (`str`),

  KEY`num_x` (`num`)

) ENGINE=InnoDB  DEFAULTCHARSET=utf8;

  向表中使用自复制语句插入数据

            insert into gyl (`str`,`num`)values(123123,"12313");

            insert into gyl (`str`,`num`) select `str`,`num` from gyl;

更改数据 update gyl set num=id,str=id

结果:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

mysql> explain

select* fromgyl wherestr=123123 limit 1;

+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+

| id | select_type | table| type | possible_keys | key  | key_len | ref  | rows   | Extra       |

+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+

|  1 | SIMPLE      | gyl   | ALL  | str_x         | NULL| NULL    | NULL| 262756 | Using where|

+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+

1 row inset

mysql> explain select* fromgyl wherestr="123123"limit 1;

+----+-------------+-------+------+---------------+-------+---------+-------+--------+-------------+

| id | select_type | table| type | possible_keys | key   | key_len | ref   | rows   | Extra       |

+----+-------------+-------+------+---------------+-------+---------+-------+--------+-------------+

|  1 | SIMPLE      | gyl   | ref  | str_x         | str_x | 257     | const | 131378 | Using where|

+----+-------------+-------+------+---------------+-------+---------+-------+--------+-------------+

1 row inset

 

mysql> explain select* fromgyl wherenum="12313"limit 1;;

+----+-------------+-------+------+---------------+-------+---------+-------+--------+-------+

| id | select_type | table| type | possible_keys | key   | key_len | ref   | rows   | Extra |

+----+-------------+-------+------+---------------+-------+---------+-------+--------+-------+

|  1 | SIMPLE      | gyl   | ref  | num_x         | num_x | 4       | const | 131378 |       |

+----+-------------+-------+------+---------------+-------+---------+-------+--------+-------+

1 row inset

 

1065 - Query was empty

mysql> explain select* fromgyl wherenum=12313 limit 1;

+----+-------------+-------+------+---------------+-------+---------+-------+--------+-------+

| id | select_type | table| type | possible_keys | key   | key_len | ref   | rows   | Extra |

+----+-------------+-------+------+---------------+-------+---------+-------+--------+-------+

|  1 | SIMPLE      | gyl   | ref  | num_x         | num_x | 4       | const | 131378 |       |

+----+-------------+-------+------+---------------+-------+---------+-------+--------+-------+

1 row inset

字段类型不同造成的隐式转换,导致索引失效

以上是 mysqlvarcharint123走索引吗? 的全部内容, 来源链接: utcz.com/z/532742.html

回到顶部