当前位置: 首页 > news >正文

mysql的trace追踪SQL工具,进行sql优化

trace是MySQL5.6版本后提供的SQL跟踪工具,通过使用trace可以让我们明白optimizer(优化器)如何选择执行计划。

注意:开启trace工具会影响mysql性能,所以只适合临时分析sql使用,用完之后请立即关闭。

测试数据脚本:

DROP TABLE IF EXISTS `t_student`;
CREATE TABLE `t_student` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`std_name` varchar(30) NOT NULL,`age` tinyint(3) unsigned NOT NULL,`class_id` int(11) unsigned NOT NULL,`gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`),KEY `idx_std_age` (`age`),KEY `idx_std_name_age_class` (`std_name`,`age`,`class_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=100766 DEFAULT CHARSET=utf8mb4;--添加测试数据的存储过程DROP PROCEDURE IF EXISTS proc_insert_student; 
DELIMITER $$
CREATE PROCEDURE proc_insert_student()        
BEGINDECLARE i INT;                   SET i=1;                          WHILE i<=100000 DO                 INSERT INTO t_student(std_name,age,class_id) VALUES(CONCAT('Li Lei',i), (i MOD 120)+1 ,(i MOD 3)+1);   SET i=i+1;                       END WHILE;
END $$-- 执行存储过程
call proc_insert_student();

trace工具用法

一.查看trace开关状态,默认关闭的

show variables like 'optimizer_trace';

二.开启face

1.会话级别临时开启,只在当前会话生效。

set session optimizer_trace="enabled=on",end_markers_in_json=on;

2.永久开启(重启失效)

注意用完关闭

set optimizer_trace="enabled=on";

三.用法

1.在查询sql后加上固定sql,例:

set session optimizer_trace="enabled=on",end_markers_in_json=on;  
select * from t_student where std_name > 'a' order by age;
SELECT * FROM information_schema.OPTIMIZER_TRACE;

2.查看执行计划,并未使用到联合索引,联合索引name使用的范围查询,一般都不会用到索引。 如果用name索引需要遍历name字段联合索引树,然后还需要根据遍历出来的主键值去主键索引树里再去查出最终数据,成本比全表扫描还高 。

EXPLAIN SELECT * FROM t_student WHERE std_name > 'a' ORDER BY age;

EXPLAIN SELECT std_name,age,class_id FROM t_student WHERE std_name > 'a' ORDER BY age;

3。如果查询是联合索引字段,那就使用了覆盖索引,这样的name范围查询,联合索引才会使用到,这样只需要遍历name字段的联合索引树就能拿到所有结果,叶子节点只存放二级索引的数据,这就不用回表操作。

TRACE列的json数据拷贝出来查看。主要是看cost值,成本

SELECT * FROM information_schema.OPTIMIZER_TRACE;
{"steps": [{"join_preparation": {  -- 第一阶段:SQL准备阶段,格式化sql"select#": 1,"steps": [{"expanded_query": "/* select#1 */ select `t_student`.`id` AS `id`,`t_student`.`std_name` AS `std_name`,`t_student`.`age` AS `age`,`t_student`.`class_id` AS `class_id`,`t_student`.`gmt_create` AS `gmt_create` from `t_student` where (`t_student`.`std_name` > 'a') order by `t_student`.`age`"}] /* steps */} /* join_preparation */},{"join_optimization": {  -- 第二阶段:SQL优化阶段"select#": 1,"steps": [{"condition_processing": {  -- 条件处理"condition": "WHERE","original_condition": "(`t_student`.`std_name` > 'a')","steps": [{"transformation": "equality_propagation","resulting_condition": "(`t_student`.`std_name` > 'a')"},{"transformation": "constant_propagation","resulting_condition": "(`t_student`.`std_name` > 'a')"},{"transformation": "trivial_condition_removal","resulting_condition": "(`t_student`.`std_name` > 'a')"}] /* steps */} /* condition_processing */},{"substitute_generated_columns": {} /* substitute_generated_columns */},{"table_dependencies": [  -- 表依赖详情{"table": "`t_student`","row_may_be_null": false,"map_bit": 0,"depends_on_map_bits": [] /* depends_on_map_bits */}] /* table_dependencies */},{"ref_optimizer_key_uses": [] /* ref_optimizer_key_uses */},{"rows_estimation": [  -- 预估表的访问成本{"table": "`t_student`","range_analysis": {"table_scan": {   -- 全表扫描"rows": 100300,  -- 行数"cost": 20351  -- 查询消耗} /* table_scan */,"potential_range_indexes": [  -- 查询可能使用的索引{"index": "PRIMARY",  -- 主键索引"usable": false,  -- 未使用"cause": "not_applicable"  -- 原因:不适合},{"index": "idx_std_age",  -- age索引"usable": false,  -- 未使用"cause": "not_applicable"  -- 原因:不适合},{"index": "idx_std_name_age_class",  -- stdname,age,class的组合索引"usable": true,  -- 使用"key_parts": ["std_name","age","class_id","id"] /* key_parts */}] /* potential_range_indexes */,"setup_range_conditions": [] /* setup_range_conditions */,"group_index_range": {  -- group 用到的索引"chosen": false,  -- 未使用"cause": "not_group_by_or_distinct"  -- 原因:未使用group by 或者 distinct} /* group_index_range */,"analyzing_range_alternatives": {   -- 分析各个索引使用成本"range_scan_alternatives": [{"index": "idx_std_name_age_class","ranges": ["a < std_name"  -- 索引使用范围] /* ranges */,"index_dives_for_eq_ranges": true,"rowid_ordered": false,  -- 使用该索引获取的记录是否按照主键排序"using_mrr": false,"index_only": false,  -- 是否使用覆盖索引"rows": 50150,  -- 索引扫描行数"cost": 60181,   -- 索引使用成本"chosen": false,  -- 是否选择该索引:否"cause": "cost"  -- 原因:消耗}] /* range_scan_alternatives */,"analyzing_roworder_intersect": {  -- 分析使用索引合并的成本"usable": false,"cause": "too_few_roworder_scans"} /* analyzing_roworder_intersect */} /* analyzing_range_alternatives */} /* range_analysis */}] /* rows_estimation */},{"considered_execution_plans": [  -- 分析出的执行计划{"plan_prefix": [] /* plan_prefix */,"table": "`t_student`","best_access_path": {  -- 最优访问路径"considered_access_paths": [  --分析出的最终访问路径{"rows_to_scan": 100300,"access_type": "scan",  -- 访问类型:为scan,全表扫描"resulting_rows": 100300,"cost": 20349,"chosen": true,  -- 确定选择"use_tmp_table": true}] /* considered_access_paths */} /* best_access_path */,"condition_filtering_pct": 100,"rows_for_plan": 100300,"cost_for_plan": 20349,"sort_cost": 100300,"new_cost_for_plan": 120649,"chosen": true}] /* considered_execution_plans */},{"attaching_conditions_to_tables": {   -- 为查询的表添加条件"original_condition": "(`t_student`.`std_name` > 'a')","attached_conditions_computation": [] /* attached_conditions_computation */,"attached_conditions_summary": [    -- 添加条件结果{"table": "`t_student`","attached": "(`t_student`.`std_name` > 'a')"}] /* attached_conditions_summary */} /* attaching_conditions_to_tables */},{"clause_processing": {   -- order by 处理"clause": "ORDER BY","original_clause": "`t_student`.`age`","items": [{"item": "`t_student`.`age`"}] /* items */,"resulting_clause_is_simple": true,"resulting_clause": "`t_student`.`age`"} /* clause_processing */},{"reconsidering_access_paths_for_index_ordering": {    -- 重构索引处理顺序"clause": "ORDER BY","steps": [] /* steps */,"index_order_summary": {"table": "`t_student`","index_provides_order": false,"order_direction": "undefined","index": "unknown","plan_changed": false} /* index_order_summary */} /* reconsidering_access_paths_for_index_ordering */},{"refine_plan": [{"table": "`t_student`"}] /* refine_plan */}] /* steps */} /* join_optimization */},{"join_execution": {    -- 第三阶段:SQL执行阶段"select#": 1,"steps": [{"filesort_information": [{"direction": "asc","table": "`t_student`","field": "age"}] /* filesort_information */,"filesort_priority_queue_optimization": {"usable": false,"cause": "not applicable (no LIMIT)"} /* filesort_priority_queue_optimization */,"filesort_execution": [] /* filesort_execution */,"filesort_summary": {"rows": 100000,"examined_rows": 100000,"number_of_tmp_files": 14,"sort_buffer_size": 262016,"sort_mode": "<sort_key, packed_additional_fields>"} /* filesort_summary */}] /* steps */} /* join_execution */}] /* steps */
}

MySQL认为 全表扫描的成本低于索引扫描,所以mysql最终选择全表扫描,

4.关闭trace

 set session optimizer_trace="enabled=off";    

相关文章:

mysql的trace追踪SQL工具,进行sql优化

trace是MySQL5.6版本后提供的SQL跟踪工具&#xff0c;通过使用trace可以让我们明白optimizer&#xff08;优化器&#xff09;如何选择执行计划。 注意&#xff1a;开启trace工具会影响mysql性能&#xff0c;所以只适合临时分析sql使用&#xff0c;用完之后请立即关闭。 测试数…...

docker部署springboot jar包项目

docker部署springboot jar包项目 前提&#xff0c;服务器环境是docker环境&#xff0c;如果服务器没有安装docker&#xff0c;可以先安装docker环境。 各个环境安装docker&#xff1a; Ubuntu上安装Docker&#xff1a; ubuntu离线安装docker: CentOS7离线安装Docker&#xff1…...

一个八年工作经验老程序员的分享

作为一个 Java 程序员&#xff0c;我在这个行业中工作了多年。在这个过程中&#xff0c;我经历了许多挑战和机遇&#xff0c;也学到了很多宝贵的经验和教训。在这篇文章中&#xff0c;我想分享一些我的感想和思考&#xff0c;希望能够对其他 Java 程序员有所帮助。 一、技术的…...

代码随想录算法训练营第四十三天|动态规划|1049. 最后一块石头的重量 II、494. 目标和、474.一和零

1049. 最后一块石头的重量 II 文章 有一堆石头&#xff0c;每块石头的重量都是正整数。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果如下&#xff1a; 如果 x y&a…...

vue3+elementPlus:el-table-column表格列动态设置单元格颜色

:cell-style属性 //html<el-tableempty-text"暂无数据":data"datalist.table":max-height"height"row-key"id"border:cell-style"cellStyle"> <el-table>//js //动态设置单元格颜色 const cellStyle ({ row, c…...

python和shell脚本,每隔五分钟将远端服务器中的文件夹数据下载到跳板机

python脚本 import subprocess import datetime import timedef run_scp_command(source_path, target_path):command [scp -r , source_path, target_path]try:subprocess.run(command, checkTrue)print("File transferred successfully!")except subprocess.Call…...

Websocket在Asp.net webApi(.net framework)上的应用

之前在写看板部分的web api的时候&#xff0c;都是通过Ajax在规定时间内轮询调用web api&#xff0c;这样简单省事&#xff0c;但是当看板多了&#xff08;并发量上来&#xff09;以后&#xff0c;比较消耗服务器的性能&#xff0c;所以最近研究了websocket&#xff0c;希望使用…...

App前端开发跨平台框架比较:React Native、Flutter、Xamarin等

引言 移动应用开发领域的跨平台框架正在不断演进&#xff0c;为开发者提供更多选择。在本文中&#xff0c;我们将比较几个流行的跨平台框架&#xff1a;React Native、Flutter和Xamarin等。讨论它们的优缺点、适用场景以及开发体验。 第一部分 React Native: 优缺点、适用场景…...

VR数字展厅在企业中应用的优势有哪些?

随着VR全景技术的成熟&#xff0c;VR数字展厅逐渐成为了企业展示形象和产品的重要手段之一。VR企业数字展厅是一种通过VR技术、3D建模技术展示企业形象和产品的创新方式&#xff0c;将企业线下的展厅搬到线上&#xff0c;为企业品牌形象带来了很多优势。 VR数字展厅在企业中应用…...

【数据库】索引 视图 触发器 分页查询

目录 1、索引 2、视图 3、触发器 4、分页查询⚠️ 1、索引 提升查询效率、当数据量小的时候&#xff0c;索引看不出来效果&#xff0c;当数据量很大的时候&#xff0c;索引会显著提高查询速度 当给表添加索引之后&#xff0c;新插入一条数据&#xff0c;就会让索引进行重新…...

*地宫取宝c++

题目 输入样例1&#xff1a; 2 2 2 1 2 2 1输出样例1&#xff1a; 2输入样例2&#xff1a; 2 3 2 1 2 3 2 1 5输出样例2&#xff1a; 14 思路 题目说从入口开始&#xff0c;只能向右或向下行走到达右下角&#xff0c;类似“摘花生”这道题的模型。题目又说只有当格子里的宝…...

同态滤波算法详解

同态滤波是一种用于增强图像的方法&#xff0c;特别适用于去除图像中的照明不均和阴影。该算法基于照射反射模型&#xff0c;将图像分解为两个分量&#xff1a;照射分量&#xff08;illumination component&#xff09;和反射分量&#xff08;reflection component&#xff09;…...

财务管理系统报账和挂账分别什么区别!报销又是什么【第三期】

前言 已经写了两期 财务管理系统之saas多租户架构是什么以及分库分表以及如何选择分布式事务方案 【程序员聊业务】财务管理系统之模块分类 报账和挂账概念 报账是指企业或个人因业务需要而发生的各项费用支出&#xff0c;在支付后&#xff0c;需要将相关的票据、凭证等提交…...

最少刷题数

最少刷题数 题目分析 对于每一名同学计算还需要再刷多少题才能保证刷题数比他多的人数不超过刷题数比他少的学生人数。我们可以考虑统计每一个分数的前缀和数组&#xff0c;sum[i]表示当前学生中&#xff0c;刷题数小于等于i的人数。那么对于学生i的刷题数a[i]&#xff0c;su…...

Python刘诗诗

写在前面 刘诗诗在电视剧《一念关山》中饰演了女主角任如意&#xff0c;这是一个极具魅力的女性角色&#xff0c;她既是一位有着高超武艺和智慧的女侠士&#xff0c;也曾经是安国朱衣卫前左使&#xff0c;身怀绝技且性格坚韧不屈。剧中&#xff0c;任如意因不满于朱衣卫的暴行…...

探索ChatGPT在软件架构师工作中的应用

随着人工智能技术的不断发展&#xff0c;自然语言处理模型如OpenAI的ChatGPT已经成为了解决各种实际问题的强大工具之一。在软件架构师这个领域&#xff0c;ChatGPT也有着广泛的应用。本文将探讨软件架构师如何有效地利用ChatGPT来解决问题和提高工作效率。 ChatGPT简介 Chat…...

pytest--allure报告中添加用例详情

前言 前面介绍了如何生成allure的报告&#xff0c;看着allure的页面非常好看&#xff0c;但是感觉少了一些内容&#xff0c;allure还可以增加一些用例详情内容&#xff0c;这样让我们的报告看着更加绚丽。 allure增加用例详情 我们可以在报告测试套件中增加用例详情内容。 …...

【深度学习笔记】9_5 多尺度目标检测

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 9.5 多尺度目标检测 在9.4节&#xff08;锚框&#xff09;中&#xff0c;我们在实验中以输入图像的每个像素为中心生成多个锚框。这些…...

Linux--vim

一.什么是vim Vim&#xff08;Vi IMproved&#xff09;是一种文本编辑器&#xff0c;通常在Linux和其他类Unix操作系统中使用。它是Vi编辑器的增强版本&#xff0c;提供了更多的功能和定制选项。Vim具有强大的文本编辑和编程功能&#xff0c;支持语法高亮、代码折叠、宏录制、…...

FreeRTOS操作系统学习——中断管理

中断管理介绍 嵌入式实时系统需要对整个系统环境产生的事件作出反应。这些事件对处理时间和响应时间都有不同的要求。事件通常采用中断方式检测&#xff0c;中断服务例程(ISR)中的处理量应当越短越好。ISR是在内核中被调用的&#xff0c; ISR执行过程中&#xff0c;用户的任务…...

Nginx从专家到小白

文章目录主要用途Nginx 本地路径映射 HTTP 服务搭建文档一、环境信息二、安装步骤2.1 下载 Nginx2.2 解压安装三、配置说明3.1 配置文件路径3.2 完整配置内容3.3 配置项说明四、常用命令4.1 启动 Nginx4.2 停止 Nginx4.3 重新加载配置4.4 查看进程状态4.5 查看端口监听4.6 测试…...

Qwen3.5-27B入门必看:Web界面操作+curl调用+错误排查全流程

Qwen3.5-27B入门必看&#xff1a;Web界面操作curl调用错误排查全流程 1. 快速了解Qwen3.5-27B Qwen3.5-27B是Qwen官方发布的视觉多模态理解模型&#xff0c;它不仅能够进行文本对话&#xff0c;还能理解图片内容。这个镜像已经在4张RTX 4090 D 24GB显卡的环境下完成部署&…...

项目介绍 MATLAB实现基于PSO-Q-learning 粒子群优化算法(PSO)结合Q学习算法(Q-learning)进行无人机三维路径规划(含模型描述及部分示例代码) 还请多多点一下关注 加油

MATLAB实现基于PSO-Q-learning 粒子群优化算法&#xff08;PSO&#xff09;结合Q学习算法&#xff08;Q-learning&#xff09;进行无人机三维路径规划的详细项目实例 更多详细内容可直接联系博主本人 或者访问对应标题的完整博客或者文档下载页面&#xff08;含完整的程序&…...

Hunyuan-MT-7B GPU部署:Pixel Language Portal在单卡A10上并发处理16路实时语音翻译压测报告

Hunyuan-MT-7B GPU部署&#xff1a;Pixel Language Portal在单卡A10上并发处理16路实时语音翻译压测报告 1. 项目背景与核心价值 Pixel Language Portal&#xff08;像素语言跨维传送门&#xff09;是一款基于Tencent Hunyuan-MT-7B大模型构建的创新翻译工具。与传统翻译软件…...

ipa 覆盖算法参数调优实战:从理论到可视化验证

1. IPA覆盖算法核心参数解析 在机器人路径规划领域&#xff0c;IPA覆盖算法因其高效性和适应性被广泛应用。这个算法的核心在于几个关键参数的协同作用&#xff0c;它们直接影响着机器人的覆盖路径质量和执行效率。让我们先来认识这些"幕后操控者"&#xff1a; cover…...

用LingBot-Depth解决实际问题:如何修复不完整的深度传感器数据?

用LingBot-Depth解决实际问题&#xff1a;如何修复不完整的深度传感器数据&#xff1f; 1. 深度传感器数据修复的挑战 深度传感器在机器人导航、三维重建和增强现实等领域发挥着关键作用&#xff0c;但原始传感器数据往往存在各种问题&#xff1a; 数据缺失&#xff1a;由于…...

OpenClaw压力测试:Qwen3-14B持续运行24小时稳定性报告

OpenClaw压力测试&#xff1a;Qwen3-14B持续运行24小时稳定性报告 1. 测试背景与目标 上周在尝试用OpenClaw自动处理一批PDF文档时&#xff0c;遇到了一个奇怪的现象&#xff1a;连续运行4小时后&#xff0c;系统响应速度明显下降&#xff0c;甚至出现了几次任务中断。这让我…...

OpenClaw+千问3.5-9B爬虫方案:智能解析与数据入库

OpenClaw千问3.5-9B爬虫方案&#xff1a;智能解析与数据入库 1. 为什么需要智能爬虫 去年我接手了一个市场调研项目&#xff0c;需要从30多个电商平台抓取商品信息和用户评价。传统爬虫开发让我吃尽苦头——每个网站都要单独写解析规则&#xff0c;反爬机制层出不穷&#xff…...

别再死记硬背分度表了!用Python+Arduino动手复现K型热电偶测温全过程

别再死记硬背分度表了&#xff01;用PythonArduino动手复现K型热电偶测温全过程 温度测量是工程实践中最基础却又最关键的环节之一。想象一下&#xff0c;当你需要监控3D打印机热床温度、测量自制咖啡烘焙机的内部环境&#xff0c;或是记录太阳能热水器的水温变化时&#xff0c…...

Phi-3-mini-4k-instruct-gguf惊艳效果:中文长难句拆解+逻辑关系标注+通俗转述三重能力展示

Phi-3-mini-4k-instruct-gguf惊艳效果&#xff1a;中文长难句拆解逻辑关系标注通俗转述三重能力展示 1. 模型能力概览 Phi-3-mini-4k-instruct-gguf作为微软Phi-3系列的轻量级文本生成模型&#xff0c;在中文处理方面展现出令人惊喜的能力。这个开箱即用的模型特别擅长处理三…...