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

分析&回答

字符串类型的索引

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

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

相关推荐
可乐ea19 分钟前
【Redis八股|第8篇】Redis 分布式锁原理与 Redisson 使用
数据库·redis·分布式·面试题·redis八股
ClouGence1 小时前
Oracle 到 OceanBase 迁移方案横评:停机导出/导入 vs OMS vs CDC 工具
数据库·oracle
从此以后自律3 小时前
MySQL 删除数据全方式详解
数据库·mysql
青山木3 小时前
Redis 高可用的最后一公里:Cluster 分片、Gossip 与故障转移全流程
数据库·redis·后端·缓存
蓝胖的四次元口袋4 小时前
JavaString知识梳理
数据库·oracle
csdn_aspnet4 小时前
mysql 使用逗号拼接一列数据
数据库·mysql·group_concat
952365 小时前
Redis - 基本操作
数据库·redis·spring·缓存
大师兄66685 小时前
HarmonyOS7 数据持久化 relationalStore:数据库实战
数据库·arkui·实战案例·harmonyos7
TDengine (老段)5 小时前
TDengine SMA 索引 — 块级/文件级统计索引
android·大数据·服务器·数据库·人工智能·时序数据库·tdengine
冰茶丿5 小时前
状态机在嵌入式系统中的应用:不只是switch-case这么简单
数据库·嵌入式硬件·mongodb