纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

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

试着奔跑的菜鸟   2021-11-18 我要评论
想了解浅谈MySql整型索引和字符串索引失效或隐式转换问题的相关内容吗试着奔跑的菜鸟在本文为您仔细讲解MySql整型索引和字符串索引失效的相关知识和一些Code实例欢迎阅读和指正我们先划重点:MySql整型索引失效,MySql字符串索引失效下面大家一起来学习吧。

问题概述

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


相关文章

猜您喜欢

  • Python绘制多角星 Python实现绘制多角星实例

    想了解Python实现绘制多角星实例的相关内容吗邓雪婷在本文为您仔细讲解Python绘制多角星的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Python实现绘制多角星,Python绘制多角星实例,Python绘制多角星下面大家一起来学习吧。..
  • Python 数据分析 Python数据分析的八种处理缺失值方法详解

    想了解Python数据分析的八种处理缺失值方法详解的相关内容吗Python学习与数据挖掘在本文为您仔细讲解Python 数据分析的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Python,缺失值处理,Python,数据分析下面大家一起来学习吧。..

网友评论

Copyright 2020 www.tdogsoftware.com 【零度软件园】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式