为什么mysql查询很慢而没有引号?

时间:2018-06-07 07:18:42

标签: mysql

表DDL为flow:

CREATE TABLE `video` (
  `short_id` varchar(50) NOT NULL,
  `prob` float DEFAULT NULL,
  `star_id` varchar(50) NOT NULL,
  `qipu_id` int(11) NOT NULL,
  `cloud_url` varchar(100) DEFAULT NULL,
  `is_identical` tinyint(1) DEFAULT NULL,
  `quality` varchar(1) DEFAULT NULL,
  PRIMARY KEY (`short_id`),
  KEY `ix_video_short_id` (`short_id`),
  KEY `sid` (`star_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

视频表有450万行。 我在mysql shell客户端中执行与flow相同的查询。除了where子句,star_id等于带有quatation标记的值,另一个不是flow。

select * from video where star_id="215343405";
12914 rows in set (0.22 sec)

select * from video where star_id=215343405;
12914 rows in set (3.17 sec)
带有quatation标记的那个比另一个快了10倍(我在star_id上创建了索引).i注意慢速不使用索引。我只是想知道mysql如何处理查询?

mysql> explain select * from video where star_id=215343405;

谢谢你!

3 个答案:

答案 0 :(得分:1)

这在manual

中得到了解答
  

为了比较字符串列和数字,MySQL不能使用   列上的索引可以快速查找值。如果str_col是   索引字符串列,执行时不能使用索引   在以下语句中查找:

     

SELECT * FROM tbl_name WHERE str_col=1;

     

原因是有许多不同的字符串可以转换为值1,例如' 1',' 1',或' 1a'。

答案 1 :(得分:0)

如果您不使用引号,则mysql将该值用作int,并且必须转换每条记录的值。因此db需要很多时间。

答案 2 :(得分:0)

引号将表达式定义为字符串,而没有单引号则将其计算为数字。这意味着MySQL被迫执行Type Conversion将数字转换为CHAR以进行适当的比较。

正如上面的文档所说,

  

为了比较字符串列和数字,MySQL不能使用   列上的索引可以快速查找值。如果str_col是   索引字符串列,执行时不能使用索引   查找...

但是,相反的情况并非如此,虽然可以使用索引,但使用字符串作为值会导致执行计划不佳(如jkavalik的sqlfiddle所示),其中使用了using where而不是更快using index condition。两者之间的主要区别在于前者需要行查找,而后者可以直接从索引中获取数据。

你一定要将列数据类型(假设它真的只包含数字)修改为适当的数据类型ASAP,但要确保没有查询实际上使用单引号,否则你会回到你开始的地方