增加强制索引依然慢

2024-06-07 22:52
文章标签 索引 强制 增加 依然

本文主要是介绍增加强制索引依然慢,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


版本: 阿里云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_idINNER JOIN store_storage ss  ON ss.storage_id = ssd.storage_idINNER JOIN store_batch_details sbd ON sbd.batch_details_id = sbdl.batch_details_idINNER 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_idLEFT JOIN store_customer sc ON sc.customer_id = sb.goods_owner_idLEFT JOIN store_customer sc3 ON sc3.customer_id = ss.customer_idLEFT JOIN warehouse w ON w.warehouse_id = ssd.warehouse_idLEFT JOIN store_customer sc2 ON sc2.customer_id = sb.supplier_id
WHERE 1 = 1AND ssd.`goods_name` LIKE CONCAT('%', '【堂食专供】葡萄(计重)', '%')AND ss.enterprise_id = 241240455403319296AND 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 DESCLIMIT 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 JOINstore_storage_details ssd ON ssd.storage_details_id = sbdl.storage_details_idINNER JOINstore_storage ss  ON ss.storage_id = ssd.storage_idINNER JOIN store_batch_details sbd ON sbd.batch_details_id = sbdl.batch_details_idINNER 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_idLEFT JOIN store_customer sc ON sc.customer_id = sb.goods_owner_idLEFT JOIN store_customer sc3 ON sc3.customer_id = ss.customer_idLEFT JOIN warehouse w ON w.warehouse_id = ssd.warehouse_idLEFT JOIN store_customer sc2 ON sc2.customer_id = sb.supplier_id
WHERE 1 = 1AND ssd.`goods_name` LIKE CONCAT('%', '【堂食专供】葡萄(计重)', '%')AND ss.enterprise_id = 241240455403319296AND ss.warehouse_id IN (272697524450807808 , 278854886203117568,358283733083942912,358310610389495808,358316852142993408,358317205127229440,358317497189199872,358319149438791680,358320040363487232,362996967464562688,432595648538574848,433271921665474560,433660539047346176,434765698913632256,460080655901245440)ORDER BY ss.create_time DESCLIMIT 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_idINNER JOIN store_storage ss force index(idx_enterprise_id_warehouse_id_create_time) ON ss.storage_id = ssd.storage_idINNER JOIN store_batch_details sbd ON sbd.batch_details_id = sbdl.batch_details_idINNER 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_idLEFT JOIN store_customer sc ON sc.customer_id = sb.goods_owner_idLEFT JOIN store_customer sc3 ON sc3.customer_id = ss.customer_idLEFT JOIN warehouse w ON w.warehouse_id = ssd.warehouse_idLEFT JOIN store_customer sc2 ON sc2.customer_id = sb.supplier_id
WHERE 1 = 1AND ssd.`goods_name` LIKE CONCAT('%', '【堂食专供】葡萄(计重)', '%')AND ss.enterprise_id = 241240455403319296AND 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 DESCLIMIT 0,20 ;

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

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

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

在这里插入图片描述

待续…

这篇关于增加强制索引依然慢的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1040534

相关文章

MySQL进阶之路索引失效的11种情况详析

《MySQL进阶之路索引失效的11种情况详析》:本文主要介绍MySQL查询优化中的11种常见情况,包括索引的使用和优化策略,通过这些策略,开发者可以显著提升查询性能,需要的朋友可以参考下... 目录前言图示1. 使用不等式操作符(!=, <, >)2. 使用 OR 连接多个条件3. 对索引字段进行计算操作4

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

Java实现Elasticsearch查询当前索引全部数据的完整代码

《Java实现Elasticsearch查询当前索引全部数据的完整代码》:本文主要介绍如何在Java中实现查询Elasticsearch索引中指定条件下的全部数据,通过设置滚动查询参数(scrol... 目录需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后需求背景通常情况下

Pandas中多重索引技巧的实现

《Pandas中多重索引技巧的实现》Pandas中的多重索引功能强大,适用于处理多维数据,本文就来介绍一下多重索引技巧,具有一定的参考价值,感兴趣的可以了解一下... 目录1.多重索引概述2.多重索引的基本操作2.1 选择和切片多重索引2.2 交换层级与重设索引3.多重索引的高级操作3.1 多重索引的分组聚

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

EMLOG程序单页友链和标签增加美化

单页友联效果图: 标签页面效果图: 源码介绍 EMLOG单页友情链接和TAG标签,友链单页文件代码main{width: 58%;是设置宽度 自己把设置成与您的网站宽度一样,如果自适应就填写100%,TAG文件不用修改 安装方法:把Links.php和tag.php上传到网站根目录即可,访问 域名/Links.php、域名/tag.php 所有模板适用,代码就不粘贴出来,已经打