MySQL索引使用:字段为varchar类型时,条件要使用''包起来

Posted 郭延龙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL索引使用:字段为varchar类型时,条件要使用''包起来相关的知识,希望对你有一定的参考价值。


结论:

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

验证过程:

    建表语句:

CREATE TABLE `gyl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `str` varchar(255) NOT NULL,
  `num` int(11) NOT NULL DEFAULT ‘0‘,
  `obj` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `str_x` (`str`),
  KEY `num_x` (`num`)
) ENGINE=InnoDB  DEFAULT CHARSET=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

结果:

mysql> explain 
select * from gyl where str=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 in set
mysql> explain select * from gyl where str=‘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 in set

mysql> explain select * from gyl where num=‘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 in set

1065 - Query was empty
mysql> explain select * from gyl where num=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 in set

  



以上是关于MySQL索引使用:字段为varchar类型时,条件要使用''包起来的主要内容,如果未能解决你的问题,请参考以下文章

mysql慢sql优化

(转)mysql数据库中存储数字字段时,选择int和varchar的区别

记一次Mysql不走日期字段索引的原因

mysql联合索引有大于小于能用到索引吗

MYSQL的各个索引类型有啥区别?

<转> MySQL中采用类型varchar(20)和varchar(255)对性能上的影响