做网站优化的关键词怎么设置/什么网站做推广比较好

做网站优化的关键词怎么设置,什么网站做推广比较好,宣传视频制作app免费,用Java或ssm做网站有什么区别🚀 MySQL 生产环境 SQL 性能优化实战案例 🏗️ 背景介绍 最近在处理一个项目时,发现在生产环境的工作流相关接口中,某些查询的执行时间异常缓慢,尽管数据量仅为 2 万条。经过分析,发现以下 SQL 语句执行非…

🚀 MySQL 生产环境 SQL 性能优化实战案例

🏗️ 背景介绍

最近在处理一个项目时,发现在生产环境的工作流相关接口中,某些查询的执行时间异常缓慢,尽管数据量仅为 2 万条。经过分析,发现以下 SQL 语句执行非常慢:

SELECT *
FROM ACT_HI_TASKINST t
LEFT JOIN ACT_HI_PROCINST p ON p.PROC_INST_ID_ = t.PROC_INST_ID_
LEFT JOIN ACT_HI_COMMENT c ON c.TASK_ID_ = t.id_;

尤其是在添加 LEFT JOIN ACT_HI_COMMENT 后,查询时间显著增加,达到了 ⏳ 1 分钟。我们需要深入分析并优化此查询。

🔍 执行计划分析

通过 EXPLAIN FORMAT=JSON 分析执行计划,得到的关键结果如下:

  • c 表有 23,754 行,但 rows_produced_per_join 却达到了 4.19 亿 行,产生了 笛卡尔积效应 💥。
  • data_read_per_join 高达 5TB,导致查询执行极为缓慢 🐌。
  • JOIN 方式为 Block Nested Loop(BNL),执行效率较低。
  • TASK_ID_ 字段缺乏合适的索引,导致 c 表进行全表扫描 📜。

执行计划示例:

{"query_block": {"select_id": 1,"cost_info": {"query_cost": "86412925.39"},"nested_loop": [{"table": {"table_name": "t","access_type": "ALL","rows_examined_per_scan": 17679,"rows_produced_per_join": 17679,"filtered": "100.00","cost_info": {"read_cost": "419.00","eval_cost": "3535.80","prefix_cost": "3954.80","data_read_per_join": "567M"},"used_columns": ["ID_","REV_","PROC_DEF_ID_","TASK_DEF_ID_","TASK_DEF_KEY_","PROC_INST_ID_","EXECUTION_ID_","SCOPE_ID_","SUB_SCOPE_ID_","SCOPE_TYPE_","SCOPE_DEFINITION_ID_","NAME_","PARENT_TASK_ID_","DESCRIPTION_","OWNER_","ASSIGNEE_","START_TIME_","CLAIM_TIME_","END_TIME_","DURATION_","DELETE_REASON_","PRIORITY_","DUE_DATE_","FORM_KEY_","CATEGORY_","TENANT_ID_","LAST_UPDATED_TIME_"]}},{"table": {"table_name": "p","access_type": "eq_ref","possible_keys": ["PROC_INST_ID_"],"key": "PROC_INST_ID_","used_key_parts": ["PROC_INST_ID_"],"key_length": "194","ref": ["work_order.t.PROC_INST_ID_"],"rows_examined_per_scan": 1,"rows_produced_per_join": 17679,"filtered": "100.00","cost_info": {"read_cost": "17679.00","eval_cost": "3535.80","prefix_cost": "25169.60","data_read_per_join": "319M"},"used_columns": ["ID_","REV_","PROC_INST_ID_","BUSINESS_KEY_","PROC_DEF_ID_","START_TIME_","END_TIME_","DURATION_","START_USER_ID_","START_ACT_ID_","END_ACT_ID_","SUPER_PROCESS_INSTANCE_ID_","DELETE_REASON_","TENANT_ID_","NAME_","CALLBACK_ID_","CALLBACK_TYPE_"]}},{"table": {"table_name": "c","access_type": "ALL","rows_examined_per_scan": 23754,"rows_produced_per_join": 419946966,"filtered": "100.00","using_join_buffer": "Block Nested Loop","cost_info": {"read_cost": "2398362.59","eval_cost": "83989393.20","prefix_cost": "86412925.39","data_read_per_join": "5T"},"used_columns": ["ID_","TYPE_","TIME_","USER_ID_","TASK_ID_","PROC_INST_ID_","ACTION_","MESSAGE_","FULL_MSG_"],"attached_condition": "<if>(is_not_null_compl(c), (work_order.c.TASK_ID_ = work_order.t.ID_), true)"}}]}
}

⚡ 优化方案

✅ 1. 增加索引

c.TASK_ID_ 添加索引,以减少全表扫描带来的影响:

ALTER TABLE ACT_HI_COMMENT ADD INDEX idx_comment_task (TASK_ID_);

🔄 2. 重新分析执行计划

索引添加后,c 表的 rows_produced_per_join4.19 亿 降至 24,421,查询方式变为 ref(通过索引查找),扫描行数大幅减少 📉。

优化后的执行计划示例:

{"query_block": {"select_id": 1,"cost_info": {"query_cost": "54475.04"},"nested_loop": [{"table": {"table_name": "t","access_type": "ALL","rows_examined_per_scan": 17679,"rows_produced_per_join": 17679,"filtered": "100.00","cost_info": {"read_cost": "419.00","eval_cost": "3535.80","prefix_cost": "3954.80","data_read_per_join": "567M"},"used_columns": ["ID_","REV_","PROC_DEF_ID_","TASK_DEF_ID_","TASK_DEF_KEY_","PROC_INST_ID_","EXECUTION_ID_","SCOPE_ID_","SUB_SCOPE_ID_","SCOPE_TYPE_","SCOPE_DEFINITION_ID_","NAME_","PARENT_TASK_ID_","DESCRIPTION_","OWNER_","ASSIGNEE_","START_TIME_","CLAIM_TIME_","END_TIME_","DURATION_","DELETE_REASON_","PRIORITY_","DUE_DATE_","FORM_KEY_","CATEGORY_","TENANT_ID_","LAST_UPDATED_TIME_"]}},{"table": {"table_name": "p","access_type": "eq_ref","possible_keys": ["PROC_INST_ID_"],"key": "PROC_INST_ID_","used_key_parts": ["PROC_INST_ID_"],"key_length": "194","ref": ["work_order.t.PROC_INST_ID_"],"rows_examined_per_scan": 1,"rows_produced_per_join": 17679,"filtered": "100.00","cost_info": {"read_cost": "17679.00","eval_cost": "3535.80","prefix_cost": "25169.60","data_read_per_join": "319M"},"used_columns": ["ID_","REV_","PROC_INST_ID_","BUSINESS_KEY_","PROC_DEF_ID_","START_TIME_","END_TIME_","DURATION_","START_USER_ID_","START_ACT_ID_","END_ACT_ID_","SUPER_PROCESS_INSTANCE_ID_","DELETE_REASON_","TENANT_ID_","NAME_","CALLBACK_ID_","CALLBACK_TYPE_"]}},{"table": {"table_name": "c","access_type": "ref","possible_keys": ["idx_comment_task"],"key": "idx_comment_task","used_key_parts": ["TASK_ID_"],"key_length": "195","ref": ["work_order.t.ID_"],"rows_examined_per_scan": 1,"rows_produced_per_join": 24421,"filtered": "100.00","cost_info": {"read_cost": "24421.20","eval_cost": "4884.24","prefix_cost": "54475.04","data_read_per_join": "347M"},"used_columns": ["ID_","TYPE_","TIME_","USER_ID_","TASK_ID_","PROC_INST_ID_","ACTION_","MESSAGE_","FULL_MSG_"]}}]}
}

优化后,查询时间从 ⏳ 1 分钟 降至毫秒级 🚀,性能得到了显著提升。

🔬 MySQL 8 本地测试情况

在 MySQL 8 本地环境进行测试时,原 SQL 语句的执行时间没有出现明显的性能问题,可能原因包括:

  • 优化器改进:MySQL 8 对 JOIN 方式进行了优化,减少了 BNL 的使用。
  • 更智能的默认索引策略:MySQL 8 在索引选择上更为智能,避免了不必要的全表扫描。
  • 测试环境数据量较小:由于本地环境数据较少,无法重现生产环境中的慢查询问题。

尽管在本地 MySQL 8 上运行正常,我们仍建议在生产环境中进行 EXPLAIN 分析,以确保优化方案的有效性。

MySQL 8.0 中引入了 Hash Join 自动选择,取代了传统的 Nested Loop Join(嵌套循环连接)。执行计划中的 "using_join_buffer": "hash join" 证实了这一点。Hash Join、并行查询和 Buffer Pool 的优化是导致问题未能在本地复现的主要原因。因此,最终我们通过与生产环境完全一致的数据库版本和配置复现了问题。

执行计划:

{"query_block": {"select_id": 1,"cost_info": {"query_cost": "36941768.34"},"nested_loop": [{"table": {"table_name": "t","access_type": "ALL","rows_examined_per_scan": 16978,"rows_produced_per_join": 16978,"filtered": "100.00","cost_info": {"read_cost": "104.75","eval_cost": "1697.80","prefix_cost": "1802.55","data_read_per_join": "544M"},"used_columns": ["ID_","REV_","PROC_DEF_ID_","TASK_DEF_ID_","TASK_DEF_KEY_","PROC_INST_ID_","EXECUTION_ID_","SCOPE_ID_","SUB_SCOPE_ID_","SCOPE_TYPE_","SCOPE_DEFINITION_ID_","NAME_","PARENT_TASK_ID_","DESCRIPTION_","OWNER_","ASSIGNEE_","START_TIME_","CLAIM_TIME_","END_TIME_","DURATION_","DELETE_REASON_","PRIORITY_","DUE_DATE_","FORM_KEY_","CATEGORY_","TENANT_ID_","LAST_UPDATED_TIME_"]}},{"table": {"table_name": "p","access_type": "eq_ref","possible_keys": ["PROC_INST_ID_"],"key": "PROC_INST_ID_","used_key_parts": ["PROC_INST_ID_"],"key_length": "194","ref": ["work_order.t.PROC_INST_ID_"],"rows_examined_per_scan": 1,"rows_produced_per_join": 16978,"filtered": "100.00","cost_info": {"read_cost": "4244.50","eval_cost": "1697.80","prefix_cost": "7744.85","data_read_per_join": "306M"},"used_columns": ["ID_","REV_","PROC_INST_ID_","BUSINESS_KEY_","PROC_DEF_ID_","START_TIME_","END_TIME_","DURATION_","START_USER_ID_","START_ACT_ID_","END_ACT_ID_","SUPER_PROCESS_INSTANCE_ID_","DELETE_REASON_","TENANT_ID_","NAME_","CALLBACK_ID_","CALLBACK_TYPE_"]}},{"table": {"table_name": "c","access_type": "ALL","rows_examined_per_scan": 21447,"rows_produced_per_join": 364127166,"filtered": "100.00","using_join_buffer": "hash join","cost_info": {"read_cost": "521306.89","eval_cost": "36412716.60","prefix_cost": "36941768.34","data_read_per_join": "4T"},"used_columns": ["ID_","TYPE_","TIME_","USER_ID_","TASK_ID_","PROC_INST_ID_","ACTION_","MESSAGE_","FULL_MSG_"],"attached_condition": "<if>(is_not_null_compl(c), (`work_order`.`c`.`TASK_ID_` = `work_order`.`t`.`ID_`), true)"}}]}
}

🎯 结论

  • 问题根因:缺少合适的索引,导致 MySQL 使用 BNL 方式进行 JOIN,引发巨量扫描。
  • 优化措施:为 TASK_ID_ 添加索引,使得 c 表的访问方式从 ALL 变为 ref,减少了扫描行数。
  • 最终效果:查询时间从 ⏳ 1 分钟 降至毫秒级 🎉。

📌 建议

  • 📊 定期检查慢查询日志,及时优化 SQL 语句。
  • 🛠️ 合理设计索引,避免全表扫描。
  • 🧐 使用 EXPLAIN 分析执行计划,确保查询能够利用索引路径。

希望本文中的优化过程能对你在 MySQL 生产环境中的性能调优有所帮助!🎯💡


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

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

相关文章

python速通小笔记-------1.容器

1.字符串的标识 字符串需要用“”标识。 与c不同&#xff0c;python 写变量时 不需要标明数据类型每一行最后不需要加&#xff1b; 2.print函数的使用 与c中的printf函数一致 3.运算符 4.字符串str操作 1. 实现字符串拼接 2.% 实现字符串初始化 %s占位会把变量强制转变为…

零基础上手Python数据分析 (2):Python核心语法快速入门

写在前面 场景:每周销售数据报表整理 任务描述: 你需要每周从多个Excel文件中汇总销售数据,计算各项指标(销售额、订单量、客单价等),并生成周报。Excel操作痛点: 文件太多,手动打开复制粘贴,效率低下,容易出错。 多个Excel文件,每个都要打开、筛选、复制数据,重复…

【PHP】获取PHP-FPM的状态信息

文章目录 一、前言二、环境三、过程1&#xff09;修改PHP-FPM配置文件2&#xff09;修改Nginx配置文件3&#xff09;访问页面4&#xff09;修改状态页面端口 一、前言 PHP-FPM内置有一个状态页面&#xff0c;通过这个页面可以获取到FPM的一些状态信息&#xff08;见下图&#…

搭建Spring Boot Admin监控系统

什么是Spring Boot Admin Spring Boot Admin 是一个用于管理和监控 Spring Boot 应用程序的开源工具。它提供了一个用户友好的 Web 界面&#xff0c;用于集中管理和监控多个 Spring Boot 应用程序的运行状态、健康状况、日志、配置等信息。 Spring Boot Admin 的核心功能 应用…

[CISCN 2022 初赛]ezpop(没成功复现)

打开在线环境可以看到&#xff1a; 记得之前做过一个类似的就是有点像照着漏洞去复现。应该可以直接在网上找到链子去打。 www.zip查看路由是 Index/test&#xff0c;然后 post 传参 a&#xff1a; exp&#xff08;参考了别的大神的wp&#xff09;&#xff1a; <?php //…

C 语 言 --- 二 维 数 组 的 应 用

C 语 言 --- 二 维 数 组 的 应 用 第 一 题 - - - 冒 泡 排 序冒 泡 排 序冒 泡 排 序 的 原 理 第 二 题 - - - 回 型 矩 阵特 点 第 三 题 - - - 蛇 形 矩 阵总结 &#x1f4bb;作者简介&#xff1a;曾 与 你 一 样 迷 茫&#xff0c;现 以 经 验 助 你 入 门 C 语 言 &…

5G核心网实训室搭建方案:轻量化部署与虚拟化实践

5G核心网实训室 随着5G技术的广泛应用&#xff0c;行业对于5G核心网人才的需求日益增长。高校、科研机构和企业纷纷建立5G实训室&#xff0c;以促进人才培养、技术创新和行业应用研究。IPLOOK凭借其在5G核心网领域的深厚积累&#xff0c;提供了一套高效、灵活的5G实训室搭建方…

寄生虫仿生算法:基于寄生虫特征的算法设计

寄生虫仿生算法:基于寄生虫特征的算法设计 基于寄生虫行为特征的仿生算法设计 import random import numpy as npclass EnhancedPBOA:def __init__(self, host_env, max_generations, population_size50):self.host_env host_envself.max_generations max_generationsself.p…

【医学影像 AI】基于深度学习的 ROP 病变检测图像评估系统

【医学影像 AI】基于深度学习的 ROP 病变检测图像评估系统 0. 论文简介0.1 基本信息0.2 摘要 1. 引言2. 材料与方法2.1 研究人群2.2 疾病分类与参考标准的制定2.3 深度学习系统开发2.4 定量严重程度评分2.5 数据分析 3. 结果4. 讨论6. 参考文献 0. 论文简介 0.1 基本信息 201…

Cursor初体验:excel转成CANoe的vsysvar文件

今天公司大佬先锋们给培训了cursor的使用&#xff0c;还给注册了官方账号&#xff01;跃跃欲试&#xff0c;但是测试任务好重&#xff0c;结合第三方工具开发也是没有头绪。 但巧的是&#xff0c;刚好下午有同事有个需求&#xff0c;想要把一个几千行的excel转成canoe的系统变…

每日一题---单词搜索(深搜)

单词搜索 给出一个二维字符数组和一个单词&#xff0c;判断单词是否在数组中出现&#xff0c; 单词由相邻单元格的字母连接而成&#xff0c;相邻单元指的是上下左右相邻。同一单元格的字母不能多次使用。 数据范围&#xff1a; 0 < 行长度 < 100 0 < 列长度 <…

【深度学习】多源物料融合算法(一):量纲对齐常见方法

目录 一、引言 二、量纲对齐常见方法 2.1 Z-score标准化Sigmoid归一化 2.2 Min-Max 归一化 2.3 Rank Transformation 2.4 Log Transformation 2.5 Robust Scaling 3、总结 一、引言 类似抖音、快手、小红书等产品的信息流推荐业务&#xff0c;主要通过信息流广告、信…

用C++新建快捷方式

1.创建文件 新建一个文件Ink.cpp,系统会自动生成对应的EXE文件 2.编写代码 #include<stdlib.h> int main(){ system("powershell -command \"$WshShellNew-Object -comObject WScript.Shell; $Shortcut$WshShell.CreateShortcut(\%UserProfile%\\Desktop\\1.…

基于Python的天气预报数据可视化分析系统-Flask+html

开发语言&#xff1a;Python框架&#xff1a;flaskPython版本&#xff1a;python3.8数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统登录 可视化界面 天气地图 天气分析 历史天气 用户管理 摘要 本文介绍了基于大数据…

基于Uniapp开发tab选项卡/标签栏前端组件

在开发一些业务场景时候&#xff0c;可能需要切换标签栏来展示不同的信息列表。 为此开发了一个Uniapp组件&#xff08;myTab&#xff09;&#xff0c;下面为组件的展示效果&#xff1a; 案例代码&#xff1a; <template><view class"content"><myt…

文本组件+Image组件+图集

Canvas部分知识补充 元素渲染顺序 以Hierarchy参考 下方物体在上方物体前显示 子物体在父物体前显示 下方物体永远在前显示&#xff0c;无论上方的层次结构 资源导入 绝对路径&#xff1a;C:\Windows\Fonts下的许多字体可以用做UIText的字体资源 图片导入&#xff1a; 1.图…

C++初阶——类和对象(二)

C初阶——类和对象&#xff08;二&#xff09; 本期内容书接上回&#xff0c;继续讨论类和对象相关内容。类和对象属于C初阶部分&#xff0c;主要反映了面向对象编程的三大基本特点之一——封装&#xff0c;在C的学习中占有举足轻重的地位&#xff01; 一、类对象模型 1.如何…

LVGL移植到6818开发板

一、移植步骤 1.lv_config.h 配置文件启动 framebuffer 2、lv_config.h 配置文件关闭SDL 2.修改main.c 去掉SDL输入设备 3.修改Makefile 文件启动交叉编译 去掉警告参数 去掉SDL库 4.交叉编译代码 make clean #清空 ⭐ 必须要清空一次再编译&#xff01; 因为修改了 lv_con…

linux系统命令——权限

一、有哪些权限 读&#xff08;r&#xff09;——对应数字4 写&#xff08;w&#xff09;——对应数字2 执行&#xff08;x&#xff09;——对应数字1 二、权限及数字的对应 4对应r-- 2对应-w- 1对应--x 5对应r-x 6对应rw- 7对应rwx 三、文件的基本属性 如图&#…

Django项目之订单管理part3

一.前言 前面两章已经把登录给做完了&#xff0c;这一章节要说的是登录的校验和登录以后的菜单展示&#xff0c;内容还是很多的。 二.菜单和权限 2.1 是否登录 当我们进入其他的页面&#xff0c;我们首先要判断是否登录&#xff0c;这个时候我们就要借助中间件来做session和…