增加强制索引依然慢


版本: 阿里云RDS MySQL 8.0.25

线上数据库CPU达到100%, 定位到如下SQL

EXPLAIN 
SELECT 
    ssd.goods_no,
            ssd.goods_name,
            ssd.goods_spec,
            ssd.goods_unit,
            ssd.create_time,
            w.warehouse_name,
            sb.batch_no,
            swl.warehouse_region_location_name,
            sc.customer_name AS goodsOwnerName,
            sc2.customer_name AS supplierName,
            ss.storage_id,
            ss.storage_no,
            ss.storage_desc,
            sbdl.storage_type,
            sbdl.create_time AS finishTime,
            sbdl.before_quantity,
            sbdl.quantity AS real_quantity,
            sbdl.after_quantity,
            sc3.customer_name,
            sbdl.storage_category,
            sb.warehouse_owner_goods_id,
            sb.goods_owner_id
FROM 
    store_batch_details_log sbdl 
    INNER JOIN store_storage_details ssd ON ssd.storage_details_id = sbdl.storage_details_id
    INNER JOIN store_storage ss  ON ss.storage_id = ssd.storage_id
    INNER JOIN store_batch_details sbd ON sbd.batch_details_id = sbdl.batch_details_id
    INNER JOIN store_batch sb ON sb.batch_id = sbd.batch_id 
    LEFT JOIN store_warehouse_location swl ON swl.warehouse_location_id = sbd.warehouse_location_id
    LEFT JOIN store_customer sc ON sc.customer_id = sb.goods_owner_id
    LEFT JOIN store_customer sc3 ON sc3.customer_id = ss.customer_id
    LEFT JOIN warehouse w ON w.warehouse_id = ssd.warehouse_id
    LEFT JOIN store_customer sc2 ON sc2.customer_id = sb.supplier_id
WHERE 
    1 = 1
        AND ssd.`goods_name` LIKE CONCAT('%', '【堂食专供】葡萄(计重)', '%')
        AND ss.enterprise_id = 241240455403319296
        AND ss.warehouse_id IN (272697524450807808 , 278854886203117568,
        358283733083942912,
        358310610389495808,
        358316852142993408,
        358317205127229440,
        358317497189199872,
        358319149438791680,
        358320040363487232,
        362996967464562688,
        362998068574220288,
        372377440368259072,
        372377840450334720,
        375321342717001728,
        377847160517230592,
        382166980817661952,
        382167317834182656,
        383586763626799104,
        392392204255334400,
        395668297183764480,
        395668683634352128,
        416633733303848960,
        427869257024753664,
        432595648538574848,
        433271921665474560,
        433660539047346176,
        434765698913632256,
        460080655901245440)
        ORDER BY ss.create_time DESC
        LIMIT 0,20 ;
        

执行计划如下
在这里插入图片描述

ss表全表扫描

因为在 ss 表上存在索引 idx_enterprise_id_warehouse_id_create_time , 既然没有使用索引, 与查询的条件有关. 于是条件上删除了一些仓库, SQL如下



EXPLAIN 
SELECT 
    ssd.goods_no,
            ssd.goods_name,
            ssd.goods_spec,
            ssd.goods_unit,
            ssd.create_time,
            w.warehouse_name,
            sb.batch_no,
            swl.warehouse_region_location_name,
            sc.customer_name AS goodsOwnerName,
            sc2.customer_name AS supplierName,
            ss.storage_id,
            ss.storage_no,
            ss.storage_desc,
            sbdl.storage_type,
            sbdl.create_time AS finishTime,
            sbdl.before_quantity,
            sbdl.quantity AS real_quantity,
            sbdl.after_quantity,
            sc3.customer_name,
            sbdl.storage_category,
            sb.warehouse_owner_goods_id,
            sb.goods_owner_id
FROM 
    store_batch_details_log sbdl 
        INNER JOIN
    store_storage_details ssd ON ssd.storage_details_id = sbdl.storage_details_id
        INNER JOIN
    store_storage ss  ON ss.storage_id = ssd.storage_id
        INNER JOIN 
    store_batch_details sbd ON sbd.batch_details_id = sbdl.batch_details_id
        INNER JOIN 
    store_batch sb ON sb.batch_id = sbd.batch_id 
            LEFT JOIN store_warehouse_location swl ON swl.warehouse_location_id = sbd.warehouse_location_id
        LEFT JOIN store_customer sc ON sc.customer_id = sb.goods_owner_id
        LEFT JOIN store_customer sc3 ON sc3.customer_id = ss.customer_id
        LEFT JOIN warehouse w ON w.warehouse_id = ssd.warehouse_id
        LEFT JOIN store_customer sc2 ON sc2.customer_id = sb.supplier_id
WHERE 
    1 = 1
        AND ssd.`goods_name` LIKE CONCAT('%', '【堂食专供】葡萄(计重)', '%')
        AND ss.enterprise_id = 241240455403319296
        AND ss.warehouse_id IN (272697524450807808 , 278854886203117568,
        358283733083942912,
        358310610389495808,
        358316852142993408,
        358317205127229440,
        358317497189199872,
        358319149438791680,
        358320040363487232,
        362996967464562688,
        432595648538574848,
        433271921665474560,
        433660539047346176,
        434765698913632256,
        460080655901245440)
        ORDER BY ss.create_time DESC
        LIMIT 0,20 ;
        

执行计划如下

在这里插入图片描述ss表使用了索引, row值也变少了 .

于是第一步的优化, 针对第一个原始的SQL, 采用了强制索引


EXPLAIN 
SELECT 
    ssd.goods_no,
            ssd.goods_name,
            ssd.goods_spec,
            ssd.goods_unit,
            ssd.create_time,
            w.warehouse_name,
            sb.batch_no,
            swl.warehouse_region_location_name,
            sc.customer_name AS goodsOwnerName,
            sc2.customer_name AS supplierName,
            ss.storage_id,
            ss.storage_no,
            ss.storage_desc,
            sbdl.storage_type,
            sbdl.create_time AS finishTime,
            sbdl.before_quantity,
            sbdl.quantity AS real_quantity,
            sbdl.after_quantity,
            sc3.customer_name,
            sbdl.storage_category,
            sb.warehouse_owner_goods_id,
            sb.goods_owner_id
FROM 
    store_batch_details_log sbdl 
    INNER JOIN store_storage_details ssd ON ssd.storage_details_id = sbdl.storage_details_id
    INNER JOIN store_storage ss force index(idx_enterprise_id_warehouse_id_create_time) ON ss.storage_id = ssd.storage_id
    INNER JOIN store_batch_details sbd ON sbd.batch_details_id = sbdl.batch_details_id
    INNER JOIN store_batch sb ON sb.batch_id = sbd.batch_id 
    LEFT JOIN store_warehouse_location swl ON swl.warehouse_location_id = sbd.warehouse_location_id
    LEFT JOIN store_customer sc ON sc.customer_id = sb.goods_owner_id
    LEFT JOIN store_customer sc3 ON sc3.customer_id = ss.customer_id
    LEFT JOIN warehouse w ON w.warehouse_id = ssd.warehouse_id
    LEFT JOIN store_customer sc2 ON sc2.customer_id = sb.supplier_id
WHERE 
    1 = 1
        AND ssd.`goods_name` LIKE CONCAT('%', '【堂食专供】葡萄(计重)', '%')
        AND ss.enterprise_id = 241240455403319296
        AND ss.warehouse_id IN (272697524450807808 , 278854886203117568,
        358283733083942912,
        358310610389495808,
        358316852142993408,
        358317205127229440,
        358317497189199872,
        358319149438791680,
        358320040363487232,
        362996967464562688,
        362998068574220288,
        372377440368259072,
        372377840450334720,
        375321342717001728,
        377847160517230592,
        382166980817661952,
        382167317834182656,
        383586763626799104,
        392392204255334400,
        395668297183764480,
        395668683634352128,
        416633733303848960,
        427869257024753664,
        432595648538574848,
        433271921665474560,
        433660539047346176,
        434765698913632256,
        460080655901245440)
        ORDER BY ss.create_time DESC
        LIMIT 0,20 ;
        

如上, 使用了 force index(idx_enterprise_id_warehouse_id_create_time) . 执行计划如下

在这里插入图片描述ss表终于使用了索引, row值也变少了 . 可在实际执行SQL语句时, 耗时14左右, 依然不理想.

继续使用 SHOW PROFILE查看具体的资源消耗使用情况

在这里插入图片描述

待续…

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在MySQL中实现upsert:如果不存在则插入?

目录 1 使用 REPLACE 2 使用 INSERT ... ON DUPLICATE KEY UPDATE 使用 INSERT IGNORE 有效会导致 MySQL 在尝试执行语句时忽略执行错误 INSERT 。这意味着 包含 索引或 字段 INSERT IGNORE 中重复值的语句 不会 产生错误,而只是完全忽略该特定 命令。其明显目的是…

2048小游戏的菜鸡实现方法

# 2048小游戏的实现与分析 2048是一款非常受欢迎的数字滑块游戏,其目标是通过滑动和合并相同数字的方块来创建一个值为2048的方块。下面,我们将通过分析一个C语言实现的2048小游戏的源代码,来探索如何用编程实现这款游戏。 ## 游戏概述 20…

指针(初阶1)

一.指针是什么 通俗的讲,指针就是地址,其存在的意义就像宾馆房间的序号一样是为了更好的管理空间。 如下图: 如上图所示,指针就是指向内存中的一块空间,也就相当于地址 二.一个指针的大小是多少 之前我们学习过&#x…

Springboot注意点

1.Usermapper里加param注解 2.RequestParam 和 RequestBody的区别: RequestParam 和 RequestBody的区别: RequestParam 和 RequestBody 是Spring框架中用于处理HTTP请求的两个不同的注 get请求一般用url传参数,所以参数名和参数的值就在ur…

LCM — Least Common Multiple 最小公倍数

因为任何一个数都可以表示为若干个质数幂的乘积。 比如75 3*5*5,即 2^0 * 3^1 * 5^2 * 7^0 ... 那么对于两个数来说,gcd就是他们取每个质数的较小幂的乘积,lcm则相反。显然,这些幂加起来就是他们乘积。 gcd(a,b) * lcm(a,b) a…

立创·天空星开发板-GD32F407VE-USART

本文以 立创天空星开发板-GD32F407VET6-青春版 作为学习的板子,记录学习笔记。 立创天空星开发板-GD32F407VE-USART 基础通信概念同步通信 & 异步通信串行通信 & 并行通信双工 & 单工通讯速率码元 串口通信数据帧 串口封装 基础通信概念 通信协议是网络…

本地运行ChatTTS

TTS 是将文字转为语音的模型,最近很火的开源 TTS 项目,本地可以运行,运行环境 M2 Max,差不多每秒钟 4~~5 个字。本文将介绍如何在本地运行 ChatTTS。 下载源码 首先下载源代码 git clone https://github…

WPF中读取Excel文件的内容

演示效果 实现方案 1.首先导入需要的Dll(这部分可能需要你自己搜一下) Epplus.dll Excel.dll ICSharpCode.SharpZipLib.dll 2.在你的解决方案的的依赖项->添加引用->浏览->选择1中的这几个Dll点击确定。(添加依赖) 3.然后看代码内容 附上源码 using Excel; usi…

TypeScript环境安装与VScode编辑器的使用

说明大背景环境,我用的是window10系统。 1.安装node.js 。 去官网下载安装包。 虽然我去的是官网,但是不知为何下载了个不知名的东西,后来又找了个链接才下载正确了。 实际上就是一个.msi的文件。我用的版本:node-v18.19.0-x6…

【第四节】C/C++数据结构之树与二叉树

目录 一、基本概念与术语 二、树的ADT 三、二叉树的定义和术语 四、平衡二叉树 4.1 解释 4.2 相关经典操作 4.3 代码展示 一、基本概念与术语 树(Tree)是由一个或多个结点组成的有限集合T。其中: 1 有一个特定的结点,称为该树的根(root)结点; 2 …

GPT-4o:突出优势 和 应用场景

还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,ech…

centos官方yum源不可用 解决方案(随手记)

昨天用yum安装软件的时候,就报错了 [rootop01 ~]# yum install -y net-tools CentOS Stream 8 - AppStream 73 B/s | 38 B 00:00 Error: Failed to download metadata for repo appstream: Cannot prepare internal mirrorlis…

从零开始:疾控中心实验室装修攻略,让你的实验室一步到位!

在当今充满挑战和变化的世界中,疾病的控制和预防成为了人类生存与发展的重要课题。而疾控中心作为防控疾病的核心机构,其疾控中心实验室设计建设显得尤为重要。下面广州实验室装修公司小编将分享疾控中心实验室设计建设方案,为疾病防控工作提…

“冻干”凭什么好吃不肥喵?既能当零食又可做主食的冻干分享

近年来,冻干猫粮因其高品质而备受喜爱,吸引了无数猫主人的目光,像我这样的资深养猫人早已开始选择冻干喂养。但新手养猫的人,可能会感到迷茫:冻干猫粮到底是什么?冻干可以一直当主食喂吗? 一、…

TqdmWarning: IProgress not found. Please update jupyter and ipywidgets.

jupyter notebook报错 在pycharm的terminal中 安装完成后就不会再报错了

缓存方法返回值

1. 业务需求 前端用户查询数据时,数据查询缓慢耗费时间; 基于缓存中间件实现缓存方法返回值:实现流程用户第一次查询时在数据库查询,并将查询的返回值存储在缓存中间件中,在缓存有效期内前端用户再次查询时,从缓存中间件缓存获取 2. 基于Redis实现 参考1 2.1 简单实现 引入…

电源小白入门学习10——浪涌、防浪涌器件、浪涌保护芯片

浪涌、防浪涌器件、浪涌保护芯片 浪涌浪涌保护器件的分类与原理保险丝TVS二极管新防护电路 浪涌 浪涌,相信不少学习过电子的同学或多或少都通过这个词,但是到底什么是浪涌呢,GPT给我的答案是这样的: 浪涌,也称为瞬态…

MS21112S单通道 LVDS 差分线路接收器

MS21112S 是一款单通道低压差分信号 (LVDS) 线 路接收器。在输入共模电压范围内,差分接收器可以 将 100mV 的差分输入电压转换成有效的逻辑输出。 该芯片可应用于 100Ω 的受控阻抗介质上,进行点对 点基带数据传输。传输介质可以是印刷电路板、…

分水岭算法分割和霍夫变换识别图像中的硬币

首先解释一下第一种分水岭算法: 一、分水岭算法 分水岭算法是一种基于拓扑学的图像分割技术,广泛应用于图像处理和计算机视觉领域。它将图像视为一个拓扑表面,其中亮度值代表高度。算法的目标是通过模拟雨水从山顶流到山谷的过程&#xff0…

数据库存储过程和锁机制

存储过程 存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的,存储过程思想上很简单,就是数据库SQL语言层面的代码封装与有重用 …