浅谈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的MVCC多版本并发控制的实现
Apr 14 MySQL
MySQL Threads_running飙升与慢查询的相关问题解决
May 08 MySQL
解读MySQL的客户端和服务端协议
May 10 MySQL
浅谈mysql执行过程以及顺序
May 12 MySQL
解决Navicat for MySQL 连接 MySQL 报2005错误的问题
May 29 MySQL
Mysql 设置boolean类型的操作
Jun 04 MySQL
MySQL如何使用使用Xtrabackup进行备份和恢复
Jun 21 MySQL
mysql中DCL常用的用户和权限控制
Mar 31 MySQL
Mysql数据库事务的脏读幻读及不可重复读详解
May 30 MySQL
MySQL事务的隔离级别详情
Jul 15 MySQL
MySQL表字段数量限制及行大小限制详情
Jul 23 MySQL
MySQL深分页问题解决思路
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
PHP 学习路线与时间表
2010/02/21 PHP
php引用返回与取消引用的详解
2013/06/08 PHP
ThinkPHP3.1新特性之命名范围的使用
2014/06/19 PHP
yii2控制器Controller Ajax操作示例
2016/07/23 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
2017/06/02 PHP
Z-Blog中用到的js代码
2007/03/15 Javascript
让FireFox支持innerText的实现代码
2009/12/01 Javascript
初识javascript 文档碎片
2010/07/13 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
jQuery基于扩展实现的倒计时效果
2016/05/14 Javascript
js实现本地图片文件拖拽效果
2017/07/18 Javascript
vue拦截器实现统一token,并兼容IE9验证功能
2018/04/26 Javascript
如何理解Vue的v-model指令的使用方法
2018/07/19 Javascript
bootstrap模态框弹出和隐藏,动态改变中间内容的实例
2018/08/10 Javascript
Vue之mixin全局的用法详解
2018/08/22 Javascript
Bootstrap实现前端登录页面带验证码功能完整示例
2020/03/26 Javascript
[00:37]2016完美“圣”典风云人物:rOtk宣传片
2016/12/09 DOTA
Python完全新手教程
2007/02/08 Python
pyqt和pyside开发图形化界面
2014/01/22 Python
python中字典(Dictionary)用法实例详解
2015/05/30 Python
Python判断直线和矩形是否相交的方法
2015/07/14 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
2016/09/18 Python
Python将string转换到float的实例方法
2019/07/29 Python
django项目简单调取百度翻译接口的方法
2019/08/06 Python
opencv3/C++ 平面对象识别&透视变换方式
2019/12/11 Python
Python pygame绘制文字制作滚动文字过程解析
2019/12/12 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
Pytorch 中的optimizer使用说明
2021/03/03 Python
轻松制作精彩视频:Animoto
2018/09/19 全球购物
MySQL面试题
2014/01/12 面试题
Linux的文件类型
2016/07/05 面试题
实习老师个人总结的自我评价
2013/09/28 职场文书
大学生村官典型材料
2014/01/12 职场文书
《三顾茅庐》教学反思
2014/04/10 职场文书
公司门卫工作职责
2014/06/28 职场文书
小学数学教学随笔
2015/08/14 职场文书