表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;
谢谢你!
答案 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,但要确保没有查询实际上使用单引号,否则你会回到你开始的地方