你知道的越多,不知道的也越多!
这种因字段类型不匹配的情况,实际在开发中不是很常见。但是随着系统数据模型越来越多的情况下,也可能会出现,字段未统一导致的。
-
表结构
假设两张表: 用户表 、用户城市code表。2张表可以通过areaCode关联。
并且各自都基于城市code做了索引 -
sql
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`area_code` tinyint(4) DEFAULT '0' COMMENT '城市code',
`name` varchar(11) DEFAULT '' COMMENT '用户名',
PRIMARY KEY (`id`),
KEY `idx_code` (`area_code`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
CREATE TABLE `user_area_code` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code` varchar(4) DEFAULT '0' COMMENT '城市code',
`city` varchar(11) DEFAULT '' COMMENT '城市名',
PRIMARY KEY (`id`),
KEY `code` (`code`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
表数据:
(1)JOIN ON 字段类型不匹配
来个简单查询小红所在的城市 , 看下执行计划
奇怪,起码 join 的时候应该也要个index 关联吧。只有个possible_key提示可以使用哪个index。
原因: user表里的area_code 是int类型的, 而 user_area_code里的code是varchar类型的。
统一字段类型之后再执行下:
(2)xx = #{xx}不匹配
总结: 虽然 上述的两条sql 都能查询到结果,那是因为MySQL在执行的时候,可以做隐士的类型转换。
但是未必能使用上索引!