问题概述

写代码的时候,有一段sql,表示该sql存在隐式转换,不走索引。

经过测试排查后,发现是类型varchar的字段, 我使用条件传入了数值型的值。

问题重现

首先我们先创建一张用户表test_user,其中USER_ID为了效果我们设置为varchar类型且加上唯一索引。

CREATE TABLE test_user (

ID int(11) NOT NULL AUTO_INCREMENT,

USER_ID varchar(11) DEFAULT NULL COMMENT '用户账号',

USER_NAME varchar(255) DEFAULT NULL COMMENT '用户名',

AGE int(5) DEFAULT NULL COMMENT '年龄',

COMMENT varchar(255) DEFAULT NULL COMMENT '简介',

PRIMARY KEY (ID)

UNIQUE KEY UNIQUE_USER_ID (USER_ID) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表格数据如下(嘻嘻 数据依旧使用与上次Mysql的文章MySQL使用UNION连接两个查询排序失效相同的数据,但是要注意表结构不同。)

ID

USER_ID

USER_NAME

AGE

COMMENT

1

111

开心菜鸟

18

今天很开心

2

222

悲伤菜鸟

21

今天很悲伤

3

333

认真菜鸟

30

今天很认真

4

444

高兴菜鸟

18

今天很高兴

5

555

严肃菜鸟

21

今天很严肃

接下来我们执行以下sql

EXPLAIN SELECT * FROM test_user WHERE USER_ID = 111;

发现给出的解释结果如下:

id

select_type

table

partitions

type

possible_keys

key

key_len

ref

rows

filtered

Extra

1

SIMPLE

test_user

ALL

5

Using where

我们给条件加上引号后再解释以下:

EXPLAIN SELECT * FROM test_user WHERE USER_ID = '111';

这时候我们发现varchar类型的字段在作为字符串查询的时候使用了索引,在以数值类型进行查询时是不使用索引的。

问题引申

那么问题来了,如果字段是整型的且加上索引,以字符串查询时会不会也不走索引呢?实践出真知,让我们再接着往下测试一下。

-- 将USER_ID的类型修改为整型

CREATE TABLE test_user (

ID int(11) NOT NULL AUTO_INCREMENT,

USER_ID int(11) DEFAULT NULL COMMENT '用户账号',

USER_NAME varchar(255) DEFAULT NULL COMMENT '用户名',

AGE int(5) DEFAULT NULL COMMENT '年龄',

COMMENT varchar(255) DEFAULT NULL COMMENT '简介',

PRIMARY KEY (ID),

UNIQUE KEY UNIQUE_USER_ID (USER_ID) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

EXPLAIN SELECT * FROM test_user WHERE USER_ID = 111;

EXPLAIN SELECT * FROM test_user WHERE USER_ID = '111';

在执行了上面两个语句后我们发现,int类型的字段无论是以字符串查询还是以数值型查询都会走索引。

结论

当我们使用的字段是数值类型时,加引号或者不加引号(sql中单引号和双引号实现相同效果)都不影响索引的使用

当我们的字段是字符串类型时,不加引号的查询无法使用索引,加引号的查询才可正常使用索引

参考资料:

Kotlin 开发者社区

国内第一Kotlin 开发者社区公众号,主要分享、交流 Kotlin 编程语言、Spring Boot、Android、React.js/Node.js、函数式编程、编程思想等相关主题。

Kotlin 开发者社区

本文分享 CSDN - 东海陈光剑。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

mysql字符串等于失效_MySql整型索引和字符串索引失效或隐式转换问题相关推荐

  1. 26.【C语言】字符串转无符号整型unsignedint、字符串转有符号整型int、无符号整型unsignedint转字符串、有符号整型转字符串(5_task)

    算法思想: 1. 字符串转无符号整型unsignedint 初始化一个字符串str:num用于存放当前转换的整型数,初始化为0.对字符串str中的每个字符进行判断,一旦扫描到当前字符在数字字符的范围之 ...

  2. mysql日期隐式转换_mysql中的隐式转换

    什么隐式类型转换? 在MySQL中: 当操作符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容.则会发生转换隐式 也就是说,MySQL会根据需要自动将数字转换为字符串,将字符串转换数字.看到 ...

  3. mysql 关闭隐式转换_Mysql中的隐式转换

    在mysql查询中,当查询条件左右两侧类型不匹配的时候会发生隐式转换,可能导致查询无法使用索引,下面分析两种隐式转换的情况看表结构phone为int类型,name为varchar类型 EXPLAIN ...

  4. MySQL 隐式转换 字符串和整型说明

    MySQL 隐式转换 字段类型定义 CREATE TABLE `user` (`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '编号',/* ...... * ...

  5. datetime 索引_MySQL 性能优化:MySQL 中的隐式转换造成的索引失效

    数据库优化是一个任重而道远的任务,想要做优化必须深入理解数据库的各种特性.在开发过程中我们经常会遇到一些原因很简单但造成的后果却很严重的疑难杂症,这类问题往往还不容易定位,排查费时费力最后发现是一个很 ...

  6. mysql 隐式转换 索引_MySQL性能优化:MySQL中的隐式转换造成的索引失效

    数据库优化是一个任重而道远的任务,想要做优化必须深入理解数据库的各种特性.在开发过程中我们经常会遇到一些原因很简单但造成的后果却很严重的疑难杂症,这类问题往往还不容易定位,排查费时费力最后发现是一个很 ...

  7. mysql 索引越界_mysql隐式转换造成索引失效的事故总结

    隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误. 由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给mysql,这样 ...

  8. mysql 隐式转换 索引_MySQL SQL优化之字符串索引隐式转换

    之前有用户很不解:SQL语句非常简单,就是select * from test_1 where user_id=1 这种类型,而且user_id上已经建立索引了,怎么还是查询很慢? test_1的表结 ...

  9. mysql隐式转换造成索引失效的事故总结

    隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误. 由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给mysql,这样 ...

最新文章

  1. mysql基础之视图
  2. 新型智能电视攻击,9成国外设备或受影响
  3. 深度学习在自动驾驶感知领域的应用
  4. java生产者消费者问题代码分析
  5. 后发送过慢的问题_点胶阀使用常见问题怎么解决
  6. angular使用Md5加密
  7. 存在sql注入漏洞的php,TCCMS在app/controller/news.class.php存在sql注入漏洞
  8. 不同版本的nutz与log4j2的集成方法
  9. 背景图片固定(背景图片附着)(HTML、CSS)
  10. Git 问题:SSL certificate problem: self signed certificate
  11. STM32——库函数流水灯程序
  12. 曾仕强主讲:易经的奥秘(全文讲义)
  13. Windows自带的远程桌面共享工具mstsc
  14. 如何创建计算机的桌面快捷方式,什么是快捷方式、如何创建快捷方式?
  15. 抗疫先锋 | IBM:同心抗疫,重塑未来 - emerge smarter!
  16. 记一次bandicom录制的mp4文件损坏修复
  17. 摩拜单车,死于创新的一百万种方式
  18. 郁 繁体为“鬰” 古同 “鬱”
  19. BlenderGIS 使用总结
  20. Allegro打断线 修剪外框outline线

热门文章

  1. C++-实现matlab的meshgird(OpenCV)
  2. android crash分析工具,Android Crash之Native Crash分析
  3. 测试工程师,必须掌握的shell变量知识
  4. 华为发布鸿蒙开发版,华为发布首款鸿蒙开发板,基于RISC-V架构,软硬生态一起抓?...
  5. Android/ios手机销售榜信息
  6. java 删 除文件操作,C语言 File文件处理 删除文件
  7. git21天打卡Day1-linux下安装git
  8. php自动关机代码,vb下的恶搞关机程序
  9. php如何安装,php如何安装freetype
  10. mysql count 与sum_Mysql下count()和sum()区别