一次Mysql查询踩坑经历(查询索引失效问题)

1、之前的sql建表脚本

CREATE TABLE `crm_driver` (`id` bigint(22) NOT NULL AUTO_INCREMENT COMMENT '主键',`clue_id` bigint(20) NOT NULL COMMENT '线索表id',`driver_name` varchar(128) NOT NULL COMMENT '试驾人姓名',`driver_phone` varchar(32) NOT NULL COMMENT '试驾人手机号',`driver_state` tinyint(1) NOT NULL DEFAULT '6' COMMENT '试驾状态 : 1-已确认、2-试驾中、3-已完成、4-已取消',`reserva_shop_id` bigint(22) NOT NULL COMMENT '预约门店id',`shop_name` varchar(64) NOT NULL DEFAULT '' COMMENT '预约门店名称',`driver_time` datetime DEFAULT NULL COMMENT '试驾时间',`drive_remarks` varchar(512) NOT NULL DEFAULT '' COMMENT '试驾备注',`affirm_is` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否确认',`route_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '路线id',`test_car_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '试驾车id',`remarks` varchar(512) NOT NULL DEFAULT '' COMMENT '备注',`is_deleted` int(11) DEFAULT '0' COMMENT '逻辑删除',`created_by` varchar(64) DEFAULT NULL COMMENT '创建人',`created_time` datetime DEFAULT NULL COMMENT '创建时间',`updated_by` varchar(64) DEFAULT NULL COMMENT '更新人',`updated_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`),KEY `idx_clue_id` (`clue_id`) USING BTREE COMMENT '线索ID',KEY `idx_driver_phone` (`driver_phone`) USING BTREE COMMENT '试驾人手机号',KEY `idx_shop_id` (`reserva_shop_id`) USING BTREE COMMENT '预约门店',KEY `idx_driver_state` (`driver_state`) USING BTREE COMMENT '试驾状态'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='试驾';

2、我接到的需求很简单,就是查询试驾表每页10条数据包含的手机号,在每个门店的试驾完成数,所以我的查询语句如下:

SELECTcd.driver_phone AS custPhone,cd.reserva_shop_id AS shopId,count( * ) AS driveCount 
FROMcrm_driver cd 
WHEREcd.driver_phone IN ( 19300000002, 19300000004, 19300000014, 19300000016, 19300000017, 19300000018, 19300000019, 19300000022, 19300000034 ) AND cd.driver_state = 3 
GROUP BYcd.driver_phone,cd.reserva_shop_id;

3、执行结果,结果花了8.7秒+

4、然后看一下数据库表的总量,只有153w+数据量

5、还有索引情况,group by  和 查询的字段 都落在索引上了

6、这时候再来执行一下explain,看看什么情况:

扫描了80w+行,然后真正使用到的索引只有 driver_state状态字段:

7、难道是in的条数多了,会导致索引查询失效吗,所以我把in 改成单个等于=试一下解析情况,发现这里还是没有用到索引:

 8、难道我加的是假索引,我再换一个字都呢,用门店字段reserva_shop_id试试,居然一下就用到了索引:

9、然后看看这两个字段有什么区别,才发现了手机号是varchar类型,门店id是bigint类型:

10、那我换成字符串类型去查询呢,试试:

这里单个字段尝试生效了:

然后再改原始的业务sql:

查询时间缩几十短,0.37秒就执行完成:

11、这里就找到问题原因了,原来是在执行查询的时候,按照常规理解,以为手机号也应该是int类型, 但是由于之前这个项目在早期的时候,别人设计的表结构字段,弄成了varchar,查询的时候导致mysql进行了隐式转换,然后索引失效,所以建表语句也要规范才行呀,不然会误导后面参与进来的其他开发同事,埋下隐形的坑。

12、总结小结:

(1)如果你的字段类型是varchar,你传参的类型是数值,会导致隐式转换索引失效;
(2)如果你的字段类型是varchar,你传参的类型是字符串,走索引;
(3)如果你的字段类型是int,你传参的类型是数值,走索引;
(4)如果你的字段类型是int,你传参的字符串,不会导致隐式转换索引失效,也会走索引(答但是不建议这么操作);

参考链接:MySQL隐式转换造成索引失效 | JavaGuide

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/64209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从 SSM 视角剖析校园一卡通密钥管理系统的技术架构演进

第2章 开发环境与技术 开发校园一卡通密钥管理系统需要搭建编程的环境,也需要通过调查,对各个相关技术进行分析,选取适合本系统开发的技术与工具。 2.1 MYSQL数据库 题目确定了是一个应用程序之后,就开始按部就班的进行设计与分析…

RabbitMQ中的Publish-Subscribe模式

在现代分布式系统中,消息队列(Message Queue)是实现异步通信和解耦系统的关键组件。RabbitMQ 是一个功能强大且广泛使用的开源消息代理,支持多种消息传递模式。其中,Publish/Subscribe(发布/订阅&#xff0…

【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(四)

目录 ARC规则 规则 对象型变量不能作为C语言结构体的成员 显式转换id和void* 属性 数组 ARC规则 规则 在ARC有效的情况下编译源代码必须遵守一定的规则: 主要解释一下最后两条 对象型变量不能作为C语言结构体的成员 要把对象型变量加入到结构体成员中时&a…

路由引入问题(双点双向路由回馈问题)

简介 总所周知,路由引入import又称路由重分发redistribute,为了解决不同路由协议进程间路由信息不互通而使用的技术,由于不同路由协议的算法、机制、开销等因素的差异,它们之间无法直接交换路由信息。因此,路由引入技…

26. Three.js案例-自定义多面体

26. Three.js案例-自定义多面体 实现效果 知识点 WebGLRenderer WebGLRenderer 是 Three.js 中用于渲染场景的主要类。它支持 WebGL 渲染,并提供了多种配置选项。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选参数对象&…

【在Linux世界中追寻伟大的One Piece】HTTP Session

目录 1 -> 引入HTTP Session 1.1 -> 定义 1.2 -> 工作原理 1.3 -> 安全性 1.4 -> 超时和失效 1.5 -> 用途 2 -> 模拟session行为 3 -> 实验测试session 1 -> 引入HTTP Session 1.1 -> 定义 HTTP Session是服务器用来跟踪用户与服务器交…

Docker-Dockerfile、registry

Dockerfile 一、概述 1、commit的局限 很容易制作简单的镜像,但碰到复杂的情况就十分不方便,例如碰到下面的情况: 需要设置默认的启动命令需要设置环境变量需要指定镜像开放某些特定的端口 2、Dockerfile是什么 Dockerfile是一种更强大的镜…

蓝桥杯刷题——day1

蓝桥杯刷题——day1 题目一题干题目解析代码 题目二题干题目解析代码 题目一 题干 给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。本题中,将空字符串定义为有效的 回文串 。 题目链接&a…

【多模态文档智能】OCR-free感知多模态大模型技术链路及训练数据细节

目前的一些多模态大模型的工作倾向于使用MLLM进行推理任务,然而,纯OCR任务偏向于模型的感知能力,对于文档场景,由于文字密度较高,现有方法往往通过增加图像token的数量来提升性能。这种策略在增加新的语言时&#xff0…

如何在 Ubuntu 22.04 上使用 Fail2Ban 保护 SSH

前言 SSH,这玩意儿,简直是连接云服务器的标配。它不仅好用,还很灵活。新的加密技术出来,它也能跟着升级,保证核心协议的安全。但是,再牛的协议和软件,也都有可能被攻破。SSH 在网上用得这么广&…

供应链系统设计-中台系统设计系列(三)- 好中台的标准之稳定原则

概述 在上一篇供应链系统设计-中台系统设计系列(二)- 好中台的标准之复用原则中,我们以复用原则为主,讨论了以下3点: 前台业务效率提升:好的中台能够显著提高前台业务的效率,通过将前台业务中通…

CTF 攻防世界 Web: FlatScience write-up

题目名称-FlatScience 网址 index 目录中没有发现提示信息,链接会跳转到论文。 目前没有发现有用信息,尝试目录扫描。 目录扫描 注意到存在 robots.txt 和 login.php。 访问 robots.txt 这里表明还存在 admin.php admin.php 分析 在这里尝试一些 sql…

axios请求拦截器和响应拦截器,封装naive-ui的 Loading Bar加载条和useMessage消息提示

接之前的博客设计从0开始边做边学,用vue和python做一个博客,非规范化项目,怎么简单怎么弄,跑的起来有啥毛病解决啥毛病(三),目前已经完成了基本的功能demo,但是请求接口不可能每个页…

Blue Ocean 在Jenkins上创建Pipeline使用详解

BlueOcean是Jenkins的一个插件,它提供了一套可视化操作界面来帮助用户创建、编辑Pipeline任务。以下是对BlueOcean中Pipeline操作的详细解释: 一、安装与启动BlueOcean 安装:在Jenkins的“系统管理”->“插件管理”->“可选插件”中搜索“BlueOcean”,然后点击“Ins…

opencv——识别图片颜色并绘制轮廓

图像边缘检测 本实验要用到Canny算法,Canny边缘检测方法常被誉为边缘检测的最优方法。 首先,Canny算法的输入端应为图像的二值化结果,接收到二值化图像后,需要按照如下步骤进行: 高斯滤波。计算图像的梯度和方向。非极…

基础库urllib的使用

学习爬虫,其基本的操作便是模拟浏览器向服务器发出请求,那么我们需要从哪个地方做起呢?请求需要我们自己构造吗?我们需要关心请求这个数据结构怎么实现吗?需要了解 HTTP、TCP、IP层的网络传输通信吗?需要知道服务器如何响应以及响应的原理吗? 可能…

剑指Offer|day4 LCR 004. 只出现一次的数字 II

LCR 004. 只出现一次的数字 II 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 **三次 。**请你找出并返回那个只出现了一次的元素。 示例 1: 输入:nums [2,2,3,2] 输出:3提示&#xff1a…

Mysql学习笔记之SQL-1

上篇文章我们介绍了Mysql的安装,这篇文章我们介绍Mysql的操作语言SQL 1. 简介 sql全称(Structured Query Language)是结构化查询语言,操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准 2. sql分类 …

埃隆马斯克X-AI发布Grok-2大模型,快来体验~

引言 近年来,人工智能技术的快速发展推动了大语言模型的广泛应用。无论是日常生活中的智能助手,还是行业中的自动化解决方案,大语言模型都扮演着越来越重要的角色。2024年,X-AI推出了新一代的大模型——Grok-2,这款模…

PostgreSQL的学习心得和知识总结(一百六十三)|深入理解PostgreSQL数据库之 GUC参数compute_query_id 的使用和实现

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…