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

分析&回答

字符串类型的索引

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

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

相关推荐
da-peng-song17 分钟前
ArcGIS Desktop使用入门(三)图层右键工具——定义查询
数据库·arcgis·拆分数据·定义查询
热爱正能量19 分钟前
数据库死锁排查思路
数据库
swordbob30 分钟前
MySQL和Oracle关于读未提交的区别
数据库·mysql·oracle
林九生34 分钟前
【实用技巧】MySQL 绿色版一键路径更新脚本详解 —— update_path.bat 深度解析
android·数据库·mysql
野生技术架构师36 分钟前
从 B+ 树到应用层分表:MySQL 海量数据架构解析
数据库·mysql·架构
Amnesia0_038 分钟前
MySQL的事务
数据库·mysql
AC赳赳老秦1 小时前
OpenClaw + 云数据库运维:自动备份、扩容、迁移 RDS/MySQL 云数据库
运维·开发语言·数据库·人工智能·python·mysql·openclaw
TDengine (老段)1 小时前
TDengine 物理计划生成 — 算子下沉、Exchange 与 Subplan 切分
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
swordbob1 小时前
MYSQL RR 解决“脏读+不可重复读“和“幻读“的本质区别
数据库·mysql
IvorySQL1 小时前
PostgreSQL 全球对话:开源链接世界,共建共治共享
数据库·postgresql·开源