浅谈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查询的控制语句图文详解
Apr 11 MySQL
MySQL root密码的重置方法
Apr 21 MySQL
MySQL 覆盖索引的优点
May 19 MySQL
正确使用MySQL update语句
May 26 MySQL
Mysql 设置boolean类型的操作
Jun 04 MySQL
MySQL系列之十三 MySQL的复制
Jul 02 MySQL
分享mysql的current_timestamp小坑及解决
Nov 27 MySQL
一条 SQL 语句执行过程
Mar 17 MySQL
如何创建一个创建MySQL数据库中的datetime类型
Mar 21 MySQL
MySQL 外连接语法之 OUTER JOIN
Apr 09 MySQL
MySQL普通表如何转换成分区表
May 30 MySQL
MySQL transaction事务安全示例讲解
Jun 21 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页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
2013/06/03 PHP
php中Ctype函数用法详解
2014/12/09 PHP
推荐一本PHP程序猿都应该拜读的书
2014/12/31 PHP
PHP给文字内容中的关键字进行套红处理
2016/04/12 PHP
PHP编程实现阳历转换为阴历的方法实例
2017/08/08 PHP
php菜单/评论数据递归分级算法的实现方法
2019/08/01 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
javascript 另一种图片滚动切换效果思路
2012/04/20 Javascript
Js如何判断客户端是PC还是手持设备简单分析
2012/11/22 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
js实现简洁大方的二级下拉菜单效果代码
2015/09/01 Javascript
jQuery旋转木马式幻灯片轮播特效
2015/12/04 Javascript
AngularJS入门教程之AngularJS模型
2016/04/18 Javascript
JavaScript的兼容性与调试技巧
2016/11/22 Javascript
微信小程序 同步请求授权的详解
2017/08/04 Javascript
jQuery中可见性过滤器简单用法示例
2018/03/31 jQuery
JS常用的几种数组遍历方式以及性能分析对比实例详解
2018/04/11 Javascript
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
jQuery实现table表格信息的展开和缩小功能示例
2018/07/21 jQuery
关于vue.js中实现方法内某些代码延时执行
2019/11/14 Javascript
[01:21]DOTA2新纪元-7.0新版本即将开启!
2016/12/11 DOTA
python利用beautifulSoup实现爬虫
2014/09/29 Python
pytorch cnn 识别手写的字实现自建图片数据
2018/05/20 Python
selenium中get_cookies()和add_cookie()的用法详解
2020/01/06 Python
通过python 执行 nohup 不生效的解决
2020/04/16 Python
五个2015 年最佳HTML5 框架
2015/11/11 HTML / CSS
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
大学毕业自我鉴定范文
2014/02/03 职场文书
开展党的群众路线教育实践活动方案
2014/02/05 职场文书
研讨会主持词
2014/04/02 职场文书
公务员群众路线心得体会
2014/11/03 职场文书
合理化建议书
2015/02/04 职场文书
司法廉洁教育心得体会
2016/01/20 职场文书
党组织关系的介绍信模板
2019/06/21 职场文书
Java实现斗地主之洗牌发牌
2021/06/14 Java/Android
基于Go语言构建RESTful API服务
2021/07/25 Golang