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

分析&回答

字符串类型的索引

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

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

相关推荐
阿洛学长3 小时前
使用 Hexo+GitHub 搭建个人免费博客教程(小白)
运维·数据库·架构
m0_624578593 小时前
PHP怎么实现X-XSS-Protection头_PHP浏览器XSS过滤【操作】
jvm·数据库·python
MongoDB 数据平台3 小时前
破解车联网数据管理困局,MongoDB助力长城汽车构建车联数智化核心引擎
数据库·mongodb
2301_779622413 小时前
如何自动计算SQL税费信息_利用触发器实时扣算税额
jvm·数据库·python
weixin_444012933 小时前
mysql在高并发环境下的读写分离与负载均衡
jvm·数据库·python
2401_824697663 小时前
如何通过phpMyAdmin给WordPress所有用户发送全站通知_系统表插入
jvm·数据库·python
CLX05053 小时前
如何管理Oracle服务器的内核共享内存_shmmax与shmall计算
jvm·数据库·python
云边有个稻草人3 小时前
端边云一体化时序数据管理:数据库选型与技术实现
数据库·端边云时序数据方案·工业物联网时序数据库·开源时序数据库选型·高压缩时序存储技术·时序数据库选型指南·tsfile 存储引擎技术
2301_812539673 小时前
golang如何实现备忘录模式_golang备忘录模式实现方案
jvm·数据库·python
weipt3 小时前
国产数据库私有化部署实战:PolarDB for PostgreSQL 免费容器版踩坑记
数据库·postgresql