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

分析&回答

字符串类型的索引

复制代码
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 就非常关键了

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

相关推荐
云心雨禅6 分钟前
Spring Boot热更新技巧:节省90%重启时间
java·数据库·spring boot
码上库利南7 分钟前
详细讲解Redis为什么被设计成单线程
数据库·redis·缓存
.似水39 分钟前
MySQL 索引和select优化
数据库·mysql
bbsh20991 小时前
WebFuture:ASP.NET启动失败报500.30错误
数据库·webfuture
胆大的2 小时前
SQL 盲注(Blind SQL Injection)
数据库·sql·安全性测试
数据库幼崽3 小时前
MySQL 排查全局锁
数据库·mysql
Java水解3 小时前
深度解析MySQL中的Join算法:原理、实现与优化
后端·mysql
啃火龙果的兔子3 小时前
华为云二级、多级域名配置
数据库·华为云
isNotNullX3 小时前
kettle好用吗?相较于国产ETL工具有哪些优劣之处?
大数据·数据库·数据仓库·信息可视化·etl
姜豆豆耶4 小时前
Oracle client 静默安装
数据库·oracle·dba