“数据类型不一致”会走索引吗?

分析&回答

字符串类型的索引

复制代码
id_1 varchar(20) NOT NULL

这样下面两条语句的结果是一样的:
SELECT * FROM ix_test WHERE id_1=1;
SELECT * FROM ix_test WHERE id_1='1';

执行计划是不同的:
mysql> explain select * from ix_test where id_1=1;
| 1 | SIMPLE | ix_test | index | PRIMARY | PRIMARY | 302 | NULL | 11 | Using where; Using index |
mysql> explain select * from ix_test where id_1='1';
| 1 | SIMPLE | ix_test | const | PRIMARY | PRIMARY | 302 | const | 1 | Using index |

复制代码

数字类型的索引

复制代码
id_1 int(20) NOT NULL
SELECT * FROM ix_test WHERE id_1=1;
SELECT * FROM ix_test WHERE id_1='1';

执行结果和执行计划都是一样的。
复制代码

结论

mysql sql优化器,对于where后面字段类型为字符串的数字,如果用数字去匹配(就是不用引号引上数字),则不能由索引直接命中,需要全部扫描。

反思&扩展

注意多表关联最容易出现上面问题

复制代码
SELECT 
  ri.order_rec_id 
FROM 
  hqew_order_goods og LEFT JOIN hqew_remove_list ri 
  ON ri.order_rec_id  =  CONCAT( og.rec_id,   ''  ) AND real_removal_numbers  >  8888 
WHERE 
  og.order_id  =   '888888' AND og.removal_numbers  >  0

ri.order_rec_id  og.rec_id 类型不一样 CONCAT 就非常关键了

喵呜面试助手:一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!

相关推荐
全栈前端老曹2 小时前
【MongoDB】Node.js 集成 —— Mongoose ORM、Schema 设计、Model 操作
前端·javascript·数据库·mongodb·node.js·nosql·全栈
神梦流2 小时前
ops-math 算子库的扩展能力:高精度与复数运算的硬件映射策略
服务器·数据库
让学习成为一种生活方式2 小时前
trf v4.09.1 安装与使用--生信工具42-version2
数据库
啦啦啦_99992 小时前
Redis-5-doFormatAsync()方法
数据库·redis·c#
生产队队长2 小时前
Redis:Windows环境安装Redis,并将 Redis 进程注册为服务
数据库·redis·缓存
老邓计算机毕设2 小时前
SSM找学互助系统52568(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·javaweb 毕业设计
痴儿哈哈2 小时前
自动化机器学习(AutoML)库TPOT使用指南
jvm·数据库·python
洛豳枭薰3 小时前
Innodb一次更新动作
mysql
Σίσυφος19003 小时前
PCL法向量估计 之 方向约束法向量(Orientation Guided Normal)
数据库
老毛肚3 小时前
手写mybatis
java·数据库·mybatis