浅谈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 05 MySQL
多属性、多分类MySQL模式设计
Apr 05 MySQL
MySQL Threads_running飙升与慢查询的相关问题解决
May 08 MySQL
MySQL8.0.18配置多主一从
Jun 21 MySQL
SQL实现LeetCode(176.第二高薪水)
Aug 04 MySQL
为什么MySQL 删除表数据 磁盘空间还一直被占用
Oct 16 MySQL
mysql分组后合并显示一个字段的多条数据方式
Jan 22 MySQL
Mysql使用全文索引(FullText index)的实例代码
Apr 03 MySQL
WINDOWS下安装mysql 8.x 的方法图文教程
Apr 19 MySQL
分析MySQL优化 index merge 后引起的死锁
Apr 19 MySQL
MySQL索引失效场景及解决方案
Jul 23 MySQL
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
Dec 24 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
Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安装配置方法
2007/05/03 PHP
PHP中调用ASP.NET的WebService的代码
2011/04/22 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
2017/05/20 PHP
JS使用replace()方法和正则表达式进行字符串的搜索与替换实例
2014/04/10 Javascript
jquery序列化表单去除指定元素示例代码
2014/04/10 Javascript
自己使用jquery写的一个无缝滚动的插件
2014/04/30 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/08/22 Javascript
AngularJS 简单应用实例
2016/07/28 Javascript
vue.js绑定class和style样式(6)
2016/12/09 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
2017/01/22 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
Vue-Access-Control 前端用户权限控制解决方案
2017/12/01 Javascript
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
vue 解决文本框被键盘遮住的问题
2019/11/06 Javascript
Vue 实现显示/隐藏层的思路(加全局点击事件)
2019/12/31 Javascript
jQuery操作事件完整实例分析
2020/01/10 jQuery
javascript事件循环event loop的简单模型解释与应用分析
2020/03/14 Javascript
vue实现学生信息管理系统
2020/05/30 Javascript
javascript实现搜索筛选功能实例代码
2020/11/12 Javascript
Python对象体系深入分析
2014/10/28 Python
python编写暴力破解FTP密码小工具
2014/11/19 Python
举例详解Python中循环语句的嵌套使用
2015/05/14 Python
详解Python import方法引入模块的实例
2017/08/02 Python
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
2017/12/20 Python
Python实现删除时保留特定文件夹和文件的示例
2018/04/27 Python
PyTorch和Keras计算模型参数的例子
2020/01/02 Python
如何基于python对接钉钉并获取access_token
2020/04/21 Python
python网络编程之五子棋游戏
2020/05/14 Python
CSS3 中filter(滤镜)属性使用详解
2020/04/07 HTML / CSS
巴基斯坦购物网站:Goto
2019/03/11 全球购物
Yahoo-PHP面试题4
2012/05/05 面试题
演讲比赛获奖感言
2014/02/02 职场文书
廉洁教育学习材料
2014/05/19 职场文书
离婚协议书怎么写2014
2014/09/30 职场文书
服务员岗位职责范本
2015/04/09 职场文书
Nginx进程调度问题详解
2021/09/25 Servers