浅谈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 相关文章推荐
jdbc使用PreparedStatement批量插入数据的方法
Apr 27 MySQL
Navicat连接MySQL错误描述分析
Jun 02 MySQL
mysql 带多个条件的查询方式
Jun 05 MySQL
MySQL 全文检索的使用示例
Jun 07 MySQL
Mysql中where与on的区别及何时使用详析
Aug 04 MySQL
MySQL悲观锁与乐观锁的实现方案
Nov 02 MySQL
MySQL中varchar和char类型的区别
Nov 17 MySQL
如何创建一个创建MySQL数据库中的datetime类型
Mar 21 MySQL
navicat 连接Ubuntu虚拟机的mysql的操作方法
Apr 02 MySQL
提高系统的吞吐量解决数据库重复写入问题
Apr 23 MySQL
讲解MySQL增删改操作
May 06 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
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
2014/05/10 PHP
php查询相似度最高的字符串的方法
2015/03/12 PHP
PHP语法小结之基础和变量
2015/11/22 PHP
Javascript 不能释放内存.
2006/09/07 Javascript
Javascript对象中关于setTimeout和setInterval的this介绍
2012/07/21 Javascript
extjs4 treepanel动态改变行高度示例
2013/12/17 Javascript
js在输入框屏蔽按键,只能键入数字的示例代码
2014/01/03 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
canvas 弹幕效果(实例分享)
2017/01/11 Javascript
完美解决浏览器跨域的几种方法(汇总)
2017/05/08 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
基于JavaScript实现报警器提示音效果
2017/10/27 Javascript
如何编写一个完整的Angular4 FormText 组件
2017/11/18 Javascript
原生JS实现的双色球功能示例
2018/02/02 Javascript
webpack 3.X学习之多页面打包的方法
2018/09/04 Javascript
使用Three.js实现太阳系八大行星的自转公转示例代码
2019/04/09 Javascript
微信小程序实现可拖动悬浮图标(包括按钮角标的实现)
2020/12/29 Javascript
php使用递归与迭代实现快速排序示例
2014/01/23 Python
用Pygal绘制直方图代码示例
2017/12/07 Python
python查询mysql,返回json的实例
2018/03/26 Python
python 将大文件切分为多个小文件的实例
2019/01/14 Python
Django 反向生成url实例详解
2019/07/30 Python
Django实现文件上传下载功能
2019/10/06 Python
Python多进程编程常用方法解析
2020/03/26 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
python程序如何进行保存
2020/07/03 Python
五分钟带你搞懂python 迭代器与生成器
2020/08/30 Python
css3实现顶部社会化分享按钮示例
2014/05/06 HTML / CSS
关于诚信的活动方案
2014/08/18 职场文书
高校教师个人总结
2015/02/10 职场文书
2015年度房地产工作总结
2015/04/09 职场文书
贴吧吧主申请感言
2015/08/03 职场文书
爱护环境建议书
2015/09/14 职场文书
高中美术教学反思
2016/02/17 职场文书
创业计划书之家教托管
2019/09/25 职场文书
mysql查询结果实现多列拼接查询
2022/04/03 MySQL