浅谈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
如何用Navicat操作MySQL
May 12 MySQL
my.ini优化mysql数据库性能的十个参数(推荐)
May 26 MySQL
mysq启动失败问题及场景分析
Jul 15 MySQL
Mysql存储过程、触发器、事件调度器使用入门指南
Jan 22 MySQL
MySql重置root密码 --skip-grant-tables
Apr 11 MySQL
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
Apr 18 MySQL
MySql数据库触发器使用教程
Jun 01 MySQL
MySQL约束(创建表时的各种条件说明)
Jun 21 MySQL
MySQL索引失效场景及解决方案
Jul 23 MySQL
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
Sep 23 MySQL
详解MySQL的内连接和外连接
May 08 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
php4的session功能评述(一)
2006/10/09 PHP
PHP教程 预定义变量
2009/10/23 PHP
PHP邮件发送类PHPMailer用法实例详解
2014/09/22 PHP
php rsa加密解密使用详解
2015/01/14 PHP
用一段js程序来实现动画功能
2007/03/06 Javascript
Javascript 对象的解释
2008/11/24 Javascript
JavaScript 计算当天是本年本月的第几周
2009/03/22 Javascript
判断iframe是否加载完成的完美方法
2010/01/07 Javascript
为调试JavaScript添加输出窗口的代码
2010/02/07 Javascript
关于javaScript注册click事件传递参数的不成功问题
2014/07/18 Javascript
Javascript前端UI框架Kit使用指南之kitjs事件管理
2014/11/28 Javascript
JavaScript使用位运算符判断奇数和偶数的方法
2015/06/01 Javascript
JavaScript中数据结构与算法(一):栈
2015/06/19 Javascript
AngularJS入门教程之双向绑定详解
2016/08/18 Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
2016/09/05 Javascript
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
2017/01/12 NodeJs
vue.js源代码core scedule.js学习笔记
2017/07/03 Javascript
iscroll.js滚动加载实例详解
2017/07/18 Javascript
webpack打包node.js后端项目的方法
2018/03/10 Javascript
vue前端框架—Mint UI详解(更适用于移动端)
2019/04/30 Javascript
nodejs中使用worker_threads来创建新的线程的方法
2021/01/22 NodeJs
JS中循环遍历数组的四种方式总结
2021/01/23 Javascript
[01:02:00]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第三场 1月24日
2021/03/11 DOTA
整理Python中的赋值运算符
2015/05/13 Python
Python简单格式化时间的方法【strftime函数】
2016/09/18 Python
Python实现统计代码行的方法分析
2017/07/12 Python
matplotlib设置legend图例代码示例
2017/12/19 Python
python并发2之使用asyncio处理并发
2017/12/21 Python
Python+matplotlib实现填充螺旋实例
2018/01/15 Python
python实现电子书翻页小程序
2019/07/23 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
2020/03/25 Python
13个Pandas实用技巧,助你提高开发效率
2020/08/19 Python
使用python把xmind转换成excel测试用例的实现代码
2020/10/12 Python
HTML5 Canvas实现玫瑰曲线和心形图案的代码实例
2014/04/10 HTML / CSS
玉兰油美国官网:OLAY美国
2018/10/25 全球购物
PostgreSQL怎么创建分区表详解
2022/06/25 PostgreSQL