浅谈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 相关文章推荐
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
May 06 MySQL
详解MySQL数据库千万级数据查询和存储
May 18 MySQL
MySQL中VARCHAR与CHAR格式数据的区别
May 26 MySQL
MySQL为id选择合适的数据类型
Jun 07 MySQL
通过shell脚本对mysql的增删改查及my.cnf的配置
Jul 07 MySQL
MySQL令人大跌眼镜的隐式转换
Aug 23 MySQL
Prometheus 监控MySQL使用grafana展示
Aug 30 MySQL
浅谈MySQL表空间回收的正确姿势
Oct 05 MySQL
浅谈MySql整型索引和字符串索引失效或隐式转换问题
Nov 20 MySQL
mysql创建存储过程及函数详解
Dec 04 MySQL
浅谈MySql update会锁定哪些范围的数据
Jun 25 MySQL
MySQL数据库查询之多表查询总结
Aug 05 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
Linux fgetcsv取得的数组元素为空字符串的解决方法
2011/11/25 PHP
php中引用符号(&)的使用详解
2013/11/13 PHP
php格式输出文件var_export函数实例
2014/11/15 PHP
php循环table实现一行两列显示的方法
2015/06/04 PHP
thinkphp3.x中display方法及show方法的用法实例
2016/05/19 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
jQuery操作input type=radio的实现代码
2012/06/14 Javascript
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
网站繁简切换的JS遇到页面卡死的解决方法
2014/03/12 Javascript
jQuery切换网页皮肤并保存到Cookie示例代码
2014/06/16 Javascript
jquery中animate的stop()方法作用实例分析
2015/01/30 Javascript
JavaScript 2048 游戏实例代码(简单易懂)
2016/03/25 Javascript
举例讲解如何判断JavaScript中对象的类型
2016/04/22 Javascript
Javascript中的async awai的用法
2017/05/17 Javascript
JavaScript实现HTML5游戏断线自动重连的方法
2017/09/18 Javascript
Vue props 单向数据流的实现
2018/11/06 Javascript
微信小程序中的店铺评分组件及vue中用svg实现的评分显示组件
2018/11/16 Javascript
vue中node_modules中第三方模块的修改使用详解
2019/05/31 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:奇迹哥卡尔秀翻全场
2017/03/28 DOTA
利用Python如何实现一个小说网站雏形
2018/11/23 Python
Python统计文本词汇出现次数的实例代码
2020/02/27 Python
Visual Studio code 配置Python开发环境
2020/09/11 Python
CSS中越界问题的经典解决方案【推荐】
2016/04/19 HTML / CSS
英国二手iPhone、音乐、电影和游戏商店:musicMagpie
2018/10/26 全球购物
奥地利度假券的专家:we-are.travel
2019/04/10 全球购物
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
怎样自定义一个异常类
2016/09/27 面试题
电子商务应届生求职信
2013/11/16 职场文书
工艺工程师岗位职责
2014/03/04 职场文书
实习护士自荐信
2014/06/21 职场文书
2014年转正工作总结
2014/11/08 职场文书
2014年管理工作总结
2014/11/22 职场文书
2014年小学数学工作总结
2014/12/12 职场文书
深度学习详解之初试机器学习
2021/04/14 Python
SQL SERVER触发器详解
2022/02/24 SQL Server