浅谈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性能压力基准测试工具sysbench的使用简介
Apr 21 MySQL
MySQL系列之六 用户与授权
Jul 02 MySQL
MySQL系列之四 SQL语法
Jul 02 MySQL
MySQL子查询中order by不生效问题的解决方法
Aug 02 MySQL
MySQL和Oracle批量插入SQL的通用写法示例
Nov 17 MySQL
Mysql中一千万条数据怎么快速查询
Dec 06 MySQL
一文弄懂MySQL中redo log与binlog的区别
Feb 15 MySQL
一文搞清楚MySQL count(*)、count(1)、count(col)区别
Mar 03 MySQL
Innodb存储引擎中的后台线程详解
Apr 03 MySQL
MySQL视图概念以及相关应用
Apr 19 MySQL
MySQL范围查询优化的场景实例详解
Jun 10 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
自动把纯文本转换成Web页面的php代码
2009/08/27 PHP
一个经典实用的PHP图像处理类分享
2014/11/18 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
flash javascript之间的通讯方法小结
2008/12/20 Javascript
jQuery 选择器理解
2010/03/16 Javascript
提升你网站水平的jQuery插件集合推荐
2011/04/19 Javascript
js正文内容高亮效果的实现方法
2013/06/30 Javascript
js取两个数组的交集|差集|并集|补集|去重示例代码
2013/08/07 Javascript
不使用jquery实现js打字效果示例分享
2014/01/19 Javascript
JavaScript闭包实例讲解
2014/04/22 Javascript
jquery $(document).ready()和window.onload的区别浅析
2015/02/04 Javascript
NodeJs基本语法和类型
2015/02/13 NodeJs
JavaScript数组常用方法
2015/03/02 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
2015/09/14 Javascript
详谈jQuery中的一些正则匹配表达式
2017/03/08 Javascript
JS中使用textPath实现线条上的文字
2017/12/25 Javascript
JavaScript中的E-mail 地址格式验证
2018/03/28 Javascript
微信小程序实现圆形进度条动画
2020/11/18 Javascript
解决Vue中 父子传值 数据丢失问题
2019/08/27 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
2020/11/26 Vue.js
[01:57]2016完美“圣”典风云人物:国士无双专访
2016/12/04 DOTA
[03:16]DOTA2完美大师赛主赛事首日集锦
2017/11/23 DOTA
python进阶教程之动态类型详解
2014/08/30 Python
浅述python中argsort()函数的实例用法
2017/03/30 Python
python实现机器学习之元线性回归
2018/09/06 Python
python 中的列表生成式、生成器表达式、模块导入
2019/06/19 Python
python3 selenium自动化 下拉框定位的例子
2019/08/23 Python
印尼网上商店:Alfacart.com
2019/03/11 全球购物
LN-CC英国:伦敦时尚生活的缩影
2019/09/01 全球购物
媒矿安全生产承诺书
2014/05/23 职场文书
员工保密协议书
2014/09/27 职场文书
销售代理协议书
2014/09/30 职场文书
免职证明样本
2014/10/23 职场文书
一年级语文上册复习计划
2015/01/17 职场文书
python批量创建变量并赋值操作
2021/06/03 Python