IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Mysql加了索引查询速度变快但是使用EXPLANE分析仍然没走索引 -> 正文阅读

[大数据]Mysql加了索引查询速度变快但是使用EXPLANE分析仍然没走索引

Mysql加了索引查询速度变快但是使用EXPLANE分析仍然没走索引

背景

最近在公司优化了一条sql,本来sql查询需要3秒左右,在某个列上加了索引之后速度变为了50毫秒左右,之后使用执行计划查看仍然没有走刚刚加的索引

案例SQL

SELECT
 某些字段
FROM
 表A AS a
 LEFT JOIN 表B as b ON a.rom_id = b.id 
WHERE a.room_id IN (
 SELECT
  f.id 
 FROM
  表D as d
  LEFT JOIN 表E as e ON 条件
  LEFT JOIN 表F as f ON 条件
  LEFT JOIN 表G as g ON 条件
 WHERE
  e.account IN ( 'X01', 'X02') GROUP BY
  f.id 
 ) 
GROUP BY
 b.id;

上面的sql有点小复杂,重点在于room_id in (SELECT ...),一开始案例sql要执行3s,在a表的room_id加索引之后,案例sql执行时间变为了50毫秒左右,但是使用EXPLAN分析仍然没有走我刚建的索引,那么执行时间怎么平白无故的缩短了呢

红框部分是新加的索引,也是让sql执行变快的那个索引

深入分析

项目使用 Springboot + mybatis-plus开发,sql执行时间统计是在代码中进行的,项目的id字段采用varchar(32)类型存储,例:1079017124602032139,之后看了些会导致索引失效的文章参考了一下,虽然我的索引并没有失效,导致索引失效的原因之一是发生了隐式转换,例如

--索引生效
SELECT * FROM a where id = 1
--索引失效
SELECT * FROM a where id = '1'

上述sql就是发生了隐式转换导致索引失效
但是我的sql并没有发生这种情况,room_id in () 是直接跟的sql查询,并没有发生隐式转换
于是定位问题可能发生在 in 里面的sql语句
单独执行 in 里面的sql语句,执行结果如下
单独执行的结果

猜想

是不是 in 里面是不是发生隐式转换呢 把varchar类型的转换成了 bigint 类型的数据呢,把 in 里面的数据替换掉,如下sql

SELECT
 某些字段
FROM
 表A AS a
 LEFT JOIN 表B as b ON a.rom_id = b.id 
WHERE a.room_id IN ('1479015132404101121','1479016368205443073','1479017124602032130','1479017753365950465') 
GROUP BY
 b.id;

再次查看执行计划
在这里插入图片描述
这次发现已经走索引了,是不是sql内部做了什么转换呢,到现在还是不解,等候mysql大佬来解答

后续进展

后来发现加rom_id类型和原表的数据类型不一致,都改成bigint类型再次用EXPLAN分析发现使用索引了,但是还是不明白开始数据类型不一致的时候没走我新加room_idx索引查询速度为什么依然变快了八九十倍

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-08 08:10:56  更:2022-05-08 08:11:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:53:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码