浅谈MySql整型索引和字符串索引失效或隐式转换问题


Posted in MySQL onNovember 20, 2021

问题概述

今天在上班时,DBA突然找出来一段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类型的字段无论是以字符串查询还是以数值型查询都会走索引。

结论

  1. 当我们使用的字段是数值类型时,加引号或者不加引号(sql中单引号和双引号实现相同效果)都不影响索引的使用
  2. 当我们的字段是字符串类型时,不加引号的查询无法使用索引,加引号的查询才可正常使用索引

综上所述,我认为以后写sql的时候注意最好都加上引号,避免这种字符串类型的不走索引的情况发生,更深层次的原理需要再挖掘一下,如果大家有什么意见可以探讨一下。

到此这篇关于浅谈MySql整型索引和字符串索引失效或隐式转换问题的文章就介绍到这了,更多相关MySql整型索引和字符串索引失效内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
将图片保存到mysql数据库并展示在前端页面的实现代码
May 02 MySQL
MySQL 重写查询语句的三种策略
May 10 MySQL
MySQL 全文索引使用指南
May 25 MySQL
MySQL 数据类型选择原则
May 27 MySQL
Mysql实现主从配置和多主多从配置
Jun 02 MySQL
MySql 8.0及对应驱动包匹配的注意点说明
Jun 23 MySQL
SQL实现LeetCode(180.连续的数字)
Aug 04 MySQL
面试被问select......for update会锁表还是锁行
Nov 11 MySQL
MySQL中varchar和char类型的区别
Nov 17 MySQL
MySQL去除密码登录告警的方法
Apr 20 MySQL
MySQL 数据 data 基本操作
May 04 MySQL
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
May 08 MySQL
mysql5.7的安装及Navicate长久免费使用的实现过程
MySQL中order by的使用详情
Nov 17 #MySQL
关于MySQL中的 like操作符详情
Nov 17 #MySQL
MySQL窗口函数的具体使用
MySQL中varchar和char类型的区别
Nov 17 #MySQL
mysql中varchar类型的日期进行比较、排序等操作的实现
Nov 17 #MySQL
MySQL数据库中varchar类型的数字比较大小的方法
Nov 17 #MySQL
You might like
浅析关于PHP位运算的简单权限设计
2013/06/30 PHP
destoon安装出现Internal Server Error的解决方法
2014/06/21 PHP
PHP采用自定义函数实现遍历目录下所有文件的方法
2014/08/19 PHP
PHP中使用imagick生成PSD文件缩略图教程
2015/01/26 PHP
学习php设计模式 php实现访问者模式(Visitor)
2015/12/07 PHP
php ajax实现文件上传进度条
2016/03/29 PHP
PHP封装cURL工具类与应用示例
2019/07/01 PHP
Javascript 面向对象 继承
2010/05/13 Javascript
浅谈Javascript事件处理程序的几种方式
2012/06/27 Javascript
javascript不同类型数据之间的运算的转换方法
2014/02/13 Javascript
Javascript保存网页为图片借助于html2canvas库实现
2014/09/05 Javascript
node.js使用require()函数加载模块
2014/11/26 Javascript
js脚本实现数据去重
2014/11/27 Javascript
JavaScript中Cookie操作实例
2015/01/09 Javascript
JavaScript的类型、值和变量小结
2015/07/09 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
JS控制弹出悬浮窗口(一览画面)的实例代码
2016/05/30 Javascript
jQuery实现点击某个div打开层,点击其他div关闭层实例分析(阻止冒泡)
2016/11/18 Javascript
基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)
2019/04/04 Javascript
JavaScript实现美化滑块效果
2019/05/17 Javascript
判断js数据类型的函数实例详解
2019/05/23 Javascript
LayUI动态设置checkbox不显示的解决方法
2019/09/02 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
2020/08/06 Javascript
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
2014/04/26 Python
浅谈python中截取字符函数strip,lstrip,rstrip
2015/07/17 Python
python进阶之多线程对同一个全局变量的处理方法
2018/11/09 Python
linux中如何使用python3获取ip地址
2019/07/15 Python
Python 异步协程函数原理及实例详解
2019/11/13 Python
解决在keras中使用model.save()函数保存模型失败的问题
2020/05/21 Python
CSS3轻松实现圆角效果
2017/11/09 HTML / CSS
STP的判定过程
2012/10/01 面试题
个人总结与自我评价
2014/09/18 职场文书
清洁工工作总结
2015/08/11 职场文书
导游词之黄果树瀑布
2019/09/20 职场文书
VS2019连接MySQL数据库的过程及常见问题总结
2021/11/27 MySQL
Tomcat弱口令复现及利用
2022/05/06 Servers