浅谈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 sql_mode修改不生效的原因及解决
May 07 MySQL
MySQL数据库压缩版本安装与配置详细教程
May 21 MySQL
解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
Jun 26 MySQL
SQL实现LeetCode(180.连续的数字)
Aug 04 MySQL
MySQL悲观锁与乐观锁的实现方案
Nov 02 MySQL
MySQL数据库中varchar类型的数字比较大小的方法
Nov 17 MySQL
防止web项目中的SQL注入
Dec 06 MySQL
MySQL创建定时任务
Jan 22 MySQL
Mysql忘记密码解决方法
Feb 12 MySQL
数据分析数据库ClickHouse在大数据领域应用实践
Apr 03 MySQL
MySQL的存储函数与存储过程的区别解析
Apr 08 MySQL
MySQL GTID复制的具体使用
May 20 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不用内置函数对数组排序的两个算法代码
2010/02/08 PHP
PHP文件上传主要代码讲解
2013/09/30 PHP
在PHP中使用X-SendFile头让文件下载更快
2014/06/01 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
php和nginx交互实例讲解
2019/09/24 PHP
用JavaScript实现仿Windows关机效果
2007/03/10 Javascript
基于MooTools的很有创意的滚动条时钟动画
2010/11/14 Javascript
多选列表框动态添加,移动,删除,全选等操作的简单实例
2014/01/13 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
AngularJS ng-style中使用filter
2016/09/21 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
2017/01/24 Javascript
js正则表达式验证表单【完整版】
2017/03/06 Javascript
JS/jquery实现一个网页内同时调用多个倒计时的方法
2017/04/27 jQuery
Easyui Datagrid自定义按钮列(最后面的操作列)
2017/07/13 Javascript
vue form 表单提交后刷新页面的方法
2018/09/04 Javascript
vue环形进度条组件实例应用
2018/10/10 Javascript
jQuery动态生成的元素绑定事件操作实例分析
2019/05/04 jQuery
通过图带你深入了解vue的响应式原理
2019/06/21 Javascript
layui table 获取分页 limit的方法
2019/09/20 Javascript
layui监听下拉选框选中值变化的方法(包含监听普通下拉选框)
2019/09/24 Javascript
Vant 中的Toast设置全局的延迟时间操作
2020/11/04 Javascript
[40:03]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#1EHOME VS Archon
2016/03/02 DOTA
[59:00]OG vs TNC 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
tensorflow创建变量以及根据名称查找变量
2018/03/10 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
2020/04/24 Python
基于Python绘制个人足迹地图
2020/06/01 Python
Django vue前后端分离整合过程解析
2020/11/20 Python
CSS3 制作绽放的莲花采用效果叠加实现
2013/01/31 HTML / CSS
房地产融资计划书
2014/01/10 职场文书
法人授权委托书格式
2014/04/08 职场文书
操行评语大全
2014/04/30 职场文书
英语教育专业毕业生求职信
2014/08/28 职场文书
优秀党支部申报材料
2014/12/24 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
大学生见习总结报告
2015/06/24 职场文书