浅谈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 13 MySQL
Mysql数据库命令大全
May 26 MySQL
MySql开发之自动同步表结构
May 28 MySQL
MYSQL(电话号码,身份证)数据脱敏的实现
May 28 MySQL
MySQL分库分表详情
Sep 25 MySQL
mysql的数据压缩性能对比详情
Nov 07 MySQL
教你使用VS Code的MySQL扩展管理数据库的方法
Jan 22 MySQL
千万级用户系统SQL调优实战分享
Mar 03 MySQL
详细介绍MySQL中limit和offset的用法
May 06 MySQL
MySQL transaction事务安全示例讲解
Jun 21 MySQL
mysql函数之截取字符串的实现
Aug 14 MySQL
postgresql如何找到表中重复数据的行并删除
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判断字符串在另一个字符串位置的方法
2014/02/27 PHP
thinkphp文件处理类Dir.class.php的用法分析
2014/12/08 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
PHP获取对象属性的三种方法实例分析
2019/01/03 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
2019/05/08 PHP
IE JS无提示关闭窗口不提示的方法
2010/04/29 Javascript
基于jQuery的前端数据通用验证库
2011/08/08 Javascript
深入理解JavaScript系列(15) 函数(Functions)
2012/04/12 Javascript
验证控件与Button的OnClientClick事件详细解析
2013/12/04 Javascript
使用vue编写一个点击数字计时小游戏
2016/08/31 Javascript
js仿手机页面文件下拉刷新效果
2016/10/14 Javascript
jQuery中 bind的用法简单介绍
2017/02/13 Javascript
JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法
2017/03/30 Javascript
ES6入门教程之Class和Module详解
2017/05/17 Javascript
利用 spin.js 生成等待效果(js 等待效果)
2017/06/25 Javascript
nodejs之get/post请求的几种方式小结
2017/07/26 NodeJs
微信小程序图片轮播组件gallery slider使用方法详解
2018/01/31 Javascript
vue axios登录请求拦截器
2018/04/02 Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
2019/04/19 Javascript
Element图表初始大小及窗口自适应实现
2020/07/10 Javascript
30秒学会30个超实用Python代码片段【收藏版】
2019/10/15 Python
基于python实现从尾到头打印链表
2019/11/02 Python
基于python读取.mat文件并取出信息
2019/12/16 Python
python绘制玫瑰的实现代码
2020/03/02 Python
使用tensorflow框架在Colab上跑通猫狗识别代码
2020/04/26 Python
python代码区分大小写吗
2020/06/17 Python
python算的上脚本语言吗
2020/06/22 Python
python+openCV对视频进行截取的实现
2020/11/27 Python
HTML5 Canvas绘制五星红旗
2016/05/04 HTML / CSS
电话销售经理岗位职责
2013/12/07 职场文书
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
《月球之谜》教学反思
2014/04/10 职场文书
公司人事专员岗位职责
2014/08/11 职场文书
2015年元旦促销方案书
2014/12/09 职场文书
社区法制宣传日活动总结
2015/05/05 职场文书
关于感恩的歌曲整理(8首)
2019/08/14 职场文书