sql类型不符合索引失效

你知道的越多,不知道的也越多!

这种因字段类型不匹配的情况,实际在开发中不是很常见。但是随着系统数据模型越来越多的情况下,也可能会出现,字段未统一导致的。

  • 表结构
    假设两张表: 用户表 、用户城市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在执行的时候,可以做隐士的类型转换。
但是未必能使用上索引!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值