浅谈MySql整型索引和字符串索引失效或隐式转换问题

作者:试着奔跑的菜鸟 时间:2024-01-15 20:41:39 

问题概述

今天在上班时,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连接两个查询排序失效相同的数据,但是要注意表结构不同。)

IDUSER_IDUSER_NAMEAGECOMMENT
1111开心菜鸟18今天很开心
2222悲伤菜鸟21今天很悲伤
3333认真菜鸟30今天很认真
4444高兴菜鸟18今天很高兴
5555严肃菜鸟21今天很严肃

接下来我们执行以下sql


EXPLAIN SELECT * FROM test_user WHERE USER_ID = 111;

发现给出的解释结果如下:

idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEtest_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的时候注意最好都加上引号,避免这种字符串类型的不走索引的情况发生,更深层次的原理需要再挖掘一下,如果大家有什么意见可以探讨一下。

来源:https://blog.csdn.net/qq_28194001/article/details/90488782

标签:MySql,整型索引,字符串索引,失效
0
投稿

猜你喜欢

  • 如何创建CSS的对象,获取合适的粒度

    2010-07-09 13:10:00
  • python3实现将json对象存入Redis以及数据的导入导出

    2022-05-05 16:31:27
  • python django model联合主键的例子

    2023-10-09 19:18:17
  • MySQL中的全表扫描和索引树扫描 的实例详解

    2024-01-24 02:39:43
  • Python获取当前时间日期的实现示例

    2021-12-26 04:43:21
  • 详解Python模块化编程与装饰器

    2023-06-30 19:49:07
  • python 密码加密与解密的实现

    2023-07-31 04:32:38
  • SQLSERVER 时间格式大全

    2024-01-28 12:13:33
  • Python学习笔记之列表推导式实例分析

    2021-04-30 15:00:38
  • 6行Python代码实现进度条效果(Progress、tqdm、alive-progress​​​​​​​和PySimpleGUI库)

    2022-09-15 16:00:46
  • Python并发之多进程的方法实例代码

    2022-04-13 12:43:54
  • Python 识别录音并转为文字的实现

    2021-12-05 02:40:28
  • Python处理文本文件中控制字符的方法

    2022-02-24 09:16:05
  • 基于Python PaddleSpeech实现语音文字处理

    2023-04-26 19:14:42
  • Python字典 dict几种遍历方式

    2023-01-14 19:48:28
  • MySQL根据某一个或者多个字段查找重复数据的sql语句

    2024-01-22 14:40:54
  • TensorBoard 计算图的可视化实现

    2021-12-06 19:39:58
  • SQL Server 2019完整安装教程(最新最详细!)

    2024-01-23 13:33:12
  • php ckeditor上传图片文件名乱码解决方法

    2024-05-03 15:53:45
  • Python爬虫requests库多种用法实例

    2021-01-10 13:31:56
  • asp之家 网络编程 m.aspxhome.com