HPM Note5, Query Performance Optimization

[b]Slow Query Basics: Optimize Data Access[/b]
Analyze a poorly performing query in two steps:
1, Find out whether your application is retrieving more data than you need
2, Find out whether the MySQL server is analyzing more rows than it needs

Typical mistakes:
1, Fetching more rows than needed
2, Fetching all columns from a multitable join
3, Fetching all columsn

The simplest query cost metrics in MySQL(Slow query log):
1, Execution time
2, Number of rows examined
3, Number of rows returned

The ratio of rows examined to rows returned is usually small-say, between 1:1 and 10:1-but sometimes it can be orders of magnitude larger

The access methods apprear in the type column in EXPLAIN's output
The access types range from a full table scan to index scans, range scans, unique index lookups and constants

If you find that a huge number of rows were examined to produce relatively few rows in the result, you can try some more sophisticated fixes:
1, Use covering indexes, which store data so that the storage engine doesn't have to retrieve the complete rows
2, Change the schema. An example is using summary tables
3, Rewrite a complicated query so the MySQL optimizer is able to execute it optimally

[b]Ways to Restructure Queries[/b]
Sometimes you can make a query more efficient by decomposing it and executing a few simple queries instead of one complex one

Chopping up the DELETE statement and using medium-size queries can improve performance and reduce replication lag considerably
[code]
// Bad
mysql > DELETE FROM messages WHERE created < DATE_SUB(NOW(), INTERVAL 3 MONTH);

// Good
rows_affected = 0
do {
rows_affected = do_query (
"DELETE FROM messages WHERE created < DATE_SUB(NOW(), INTERVAL 3 MONTH) LIMIT 10000"
)
} while rows_affected > 0
[/code]

Many high-performance web sites use join decomposition
You can decompose a join by running multiple single-table queries instead of a multitable join, and then performing the join in the application
[code]
// Bad
SELECT * FROM tag JOIN tag_post ON tag_post.tag_id = tag.id JOIN post ON tag_post.post_id = post.id WHERE tag.tag = 'mysql'

//Good
SELECT * FROM tag WHERE tag='mysql'
SELECT * FROM tag_post WHERE tag_id = 1234
SELECT * FROM post WHERE post.id in (123,456,567,9098,8904)
[/code]

Doing joins in the application may be more efficient when:
1, You cache and reuse a lot of data from earlier queries
2, You use multiple MyISAM tables
3, You distribute data across multiple servers
4, You replace joins with IN() lists on large tables
5, A join refers to the same table multiple times

[b]Query Execution Basics[/b]
What happens when you send MySQL a query:
1, The client sends the SQL statement to the server
2, The server checks the query cache
3, The server parses, preprocesses, and optimizes the SQL into a query execution plan
4, The query execution engine executes the plan by making calls to the storage engine API
5, The server sends the result to the client

The MySQL Client/Server Protocol is half duplex, which means that at any given time the MySQL server can be either sending or receiving messages, but not both
It also means there is no way to cut a message short
There's no flow control; once oneside sends a message, the other side must fetch the entire message before responding
When the server responds, the client has to receive the entire result set

You can use SHOW FULL PROCESSLIST to view MySQL connection or thread state:
1, Sleep
The thread is waiting for a new query from the client
2, Query
The thread is either executing the query or sending the result back to the client
3, Locked
The thread is waiting for a table lock to be granted at the server level
4, Analyzing and statistics
The thread is checking storage engine statistics and optimizing the query
5, Copying to tmp table [on disk]
The thread is processing the query and copying results to a temporary table, probably for a GROUP BY, for a filesort, or to satisfy a UNION
If the state ends with "on disk", MySQL is converting an in-memory table to an on-disk table
6, Sorting result
The thread is sorting a result set
7, Sending data
This can mean several things: the thread might be sending data between stages of the query, generating the result set, or returning the result set to the client

Some types of optimizations MySQL knows how to do:
1, Reordering joins
2, Converting OUTER JOINS to INNER JOINS
3, Applying algebraic equivalence rules
4, COUNT(), MIN(), and MAX() optimizations
5, Evaluating and reducing constant expressiosn
6, Covering indexes
7, Subquery optimization
8, Early termination
9, Equality propagation
10, IN() list comparisons

// to-do
// Have a thorough understanding of MySQL parser/optimizer

[b]Optimizing Specific Types of Queries[/b]
COUNT
[code]
// Bad
SELECT COUNT(*) FROM world.City WHERE ID > 5;
// Good
SELECT (SELECT COUNT(*) FROM world.City) - COUNT(*) FROM world.City WHERE ID <= 5;
[/code]
Use covering index, Summary tables or external caching system such as memcached

JOIN
1, Make sure there are indexes on the columns in the ON or USING clauses
2, Try to ensure that any GROUP BY or ORDER BY expression refers only to columns from a single table
3, Be careful when upgrading MySQL, because the join syntax, operator precedence, and other behaviors have changed at various times

Subqueries
You should usually prefer a join where possible

GROUP BY and DISTINCT
WITH ROLLUP or do superaggregation in your application

LIMIT and OFFSET
Covering index
Convert the limit to a positional query by precalculate and index a position column
Precomputed summaries
Sphinx

UNION
Always use UNION ALL
Azure Blob Storage与Files核心差异及生产级选型指南 云文件存储本质是协议语义的选择:Blob基于HTTP REST的对象存储,适用于海量非结构化数据的高吞吐读写;Files则实现完整的SMB/NFS文件系统协议,支撑传统应用所需的路径遍历、文件锁和ACL继承。理解二者在访问模型、权限控制(SAS token、Azure AD集成)、存储账户类型(Premium_LRS对Files性能的决定性影响)及生命周期行为上的根本差异,是避免权限失控、性能瓶颈与成本暴增的前提。本文聚焦Azure文件存储的工程落地逻辑,覆盖从协议栈原理到冷热分层、Immutable Po 阅读详情

相关推荐

避免过度投入:技术人的深度管理策略与实操框架

在技术学习和项目实践中,如何高效投入并管理风险是开发者普遍面临的挑战。其核心原理在于对‘深度’进行战略性的界定与规划,这直接关系到个人成长效率与职业发展的可持续性。通过区分‘核心深度’与‘支持深度’,并引入‘最小可行深度’概念,可以有效聚焦高价值领域,避免资源浪费。这一策略的技术价值在于,它能帮助工程师、产品经理等从业者构建灵活且抗风险的能力体系,防止因过早或过度陷入特定技术栈、项目细节而导致的‘沉没成本’和‘路径依赖’问题。其应用场景广泛,涵盖了新技术学习、复杂项目推进以及个人项目或副业运营等多个方面。本

hideto 464

计算机组成原理 7 大核心概念精讲:从 CPU 到 MIPS 的 15 个关键术语解析

本文深入解析计算机组成原理的7大核心概念,从CPU内部结构到MIPS指令系统,涵盖15个关键术语。通过层次化系统结构、冯·诺依曼体系、存储器层次等核心内容,帮助读者构建完整的计算机硬件知识体系,特别适合计算机专业学生和硬件工程师参考学习。

hideto 478

Python实现Serpent算法:从零构建32轮分组密码的实践指南

分组密码是现代密码学的核心组件,它通过对固定长度的数据块进行加密来保障信息安全。其基本原理是通过多轮迭代的混淆与扩散操作,将明文与密钥充分混合,生成看似随机的密文。这种设计在安全性与性能之间取得了平衡,广泛应用于数据加密、安全通信和存储等场景。Serpent算法作为AES竞赛的决赛选手,以其极致的保守主义设计哲学著称,通过采用32轮加密和精心设计的S盒,提供了巨大的安全冗余。本文聚焦于使用Python实现Serpent算法,深入剖析其密钥扩展、S盒应用和线性变换等核心组件,并探讨了在Python环境中处理比

hideto 424

Unity卡牌游戏UI框架设计:MVC与事件驱动架构实战

在游戏开发中,UI架构设计是保障项目可维护性与扩展性的核心。MVC(Model-View-Controller)模式通过分离数据、视图与控制逻辑,有效降低了模块间的耦合度。结合事件驱动架构,系统各组件通过发布/订阅事件进行通信,进一步实现了松耦合与高内聚,这对于状态频繁变化、交互复杂的卡牌游戏尤为重要。这种架构模式的技术价值在于提升了代码的可读性、可测试性,并便于团队协作开发。在卡牌游戏场景中,它能够优雅地处理手牌动态布局、卡牌状态同步、动画序列管理等高频需求。本文以Unity引擎为例,深入探讨如何将MVC

hideto 416

基于MATLAB的太阳能光伏电力仿真,模拟每日太阳能发电,可视化功率曲线,并通过数值积分计算总能量输出。.zip

1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

人脸识别签到考勤系统实战源码

这是一套可直接运行的人脸识别智能签到考勤系统,基于OpenCV YuNet人脸检测与SFace特征识别实现,全程本机运行,数据保存在本地SQLite,不上传任何服务器。配套交付完整Python源码、9章实战教程(md/html/pdf三种格式)、逐步骤操作截图和答辩PPT讲解。 系统围绕五个功能模块展开:人脸注册支持照片批量导入并提取特征入库;识别签到支持照片或摄像头两种方式,实时框出人脸并标注姓名、相似度与考勤状态;考勤规则引擎按config.py里配置的上下班时间与宽限分钟,自动判定迟到、早退、缺勤;Tkinter管理面板完成人员管理、流水查询与月度汇总;最后通过openpyxl一键导出整月考勤矩阵,正常绿、迟到黄、缺勤红,Excel打开即用。 选型上特意选了YuNet+SFace路线:纯pip安装免编译,CPU单帧识别不到100ms,两个ONNX模型共约37MB,出自OpenCV官方模型仓库,毕设报告引用有据可查。教程第7章整理了16条Windows下真实踩过的报错及排查方法,第8章给出换模型、换人脸、加功能的二次开发路径。 适合做计算机视觉方向毕设或课程设计的学生,也适合想给班级、实验室、小团队搭一套本地签到工具的Python学习者。运行环境为Python 3.9以上、Windows 10/11,不需要GPU。 使用时先pip install -r requirements.txt装齐依赖,再运行download_data.py下载模型,最后启动main.py即可进入图形界面;命令行register、recognize、report子命令也可脱离界面单独调用。

OpenCV 4.8 DNN 模块调用 YOLOv3:CPU 推理 3 大性能瓶颈分析与优化

本文深入分析了OpenCV 4.8 DNN模块在CPU环境下调用YOLOv3进行目标检测时的三大性能瓶颈:计算密集型操作、内存访问模式低效和线程调度开销,并提供了经过实战验证的优化方案。通过启用OpenCV优化后端、调整内存布局、优化线程调度以及模型量化剪枝等技巧,显著提升了推理性能,为计算机视觉开发者提供了实用的性能优化参考。

hideto 379

【电力负荷预测】项目介绍 MATLAB实现基于BO-Transformer-LSTM贝叶斯优化算法(BO)优化Transformer-LSTM组合模型进行居民用户多步电力负荷预测(含模型描述及部分示例

内容概要:本文介绍了一个基于BO-Transformer-LSTM的组合模型,用于实现居民用户多步电力负荷预测的完整项目实例。该模型融合Transformer的全局注意力机制与LSTM的局部时序记忆能力,构建能够捕捉长时依赖与周期性特征的深度学习架构,并引入贝叶斯优化(BO)自动搜索最优超参数组合,提升预测精度与训练效率。项目涵盖从原始数据清洗、特征工程、滑动窗口样本构建、模型设计到超参数优化、反归一化及多步误差评估的全流程,强调时间顺序划分以防止信息泄露,并通过周期编码、外生变量融合等方式增强数据表达能力。文中提供了详细的MATLAB代码示例,包括数据预处理、网络搭建、贝叶斯优化配置和预测结果评估等关键步骤。 适合人群:具备一定机器学习和时间序列分析基础,熟悉MATLAB编程环境,从事电力系统预测、智能电网、负荷管理等相关领域的研究人员、工程师及研究生。 使用场景及目标:①应用于居民级或多用户聚合负荷的短期至中期多步预测(如未来24小时);②服务于配电系统运行调度、需求响应基线设定、家庭能源管理系统优化、分布式能源协调控制等实际工程场景;③为科研提供可复现的深度学习+贝叶斯优化的技术路线参考。 阅读建议:此资源以实际项目为导向,建议读者结合提供的代码逐步实现并调试模型,重点关注数据质量控制、时间特征编码、组合网络结构设计与贝叶斯优化稳定性之间的协同关系,在实践中深入理解多步预测中的误差累积机制与超参数敏感性问题。

MySQL Architecture

[img]http://dev.mysql.com/doc/refman/5.1/en/images/PSEArch.png[/img] MySQL Core Modules: [b]Server Initialization Module[/b] The Server Initialization Module is responsible for the server initial...

hideto 218

国央企创新负责人如何通过平台实现科研成果的快速识别与转化?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

PotPlayer自用皮肤

自用 PotPlayer 皮肤,仅微调了字体大小与颜色,是按个人习惯调整,未做适配性调整。

HPM Note4, Schema Optimization and Indexing

[b]Choosing Optimal Data Types[/b] Smaller is usually better Simple is good Avoid NULL if possible [b]Indexing Basics[/b] Indexes are implemented in the storage engine layer, not the server lay...

hideto 178

2-shell及常用命令-续.pdf

2-shell及常用命令-续.pdf

HPM Note2, MySQL Architecture

[b]MySQL's Logical Architecture[/b] Three layer: 1, Connection/thread handling 2, Query parsing, analysis, optimization, caching, build-in functions 3, Storage engine MySQL server caches thread...

hideto 167

Matlab App Designer自学笔记(六):坐标轴控件axis函数绘图方法

作用: 绘制函数显示 显示图像(jpg png tiff) 颜色选项: r(红色) g(绿色) b(蓝色) w(白色) k(黑色) 其他 一、坐标区控件及设置 可以对坐标去进行设计: 二、功能实现及编程 功能:点击“绘图按钮”,能显示曲线。 实现:对按钮设置回调函数 若要多个图像显示在一个坐标系中,需要语句:hold(app.UIAxes,"on"); app.UIAxes是这个坐标轴的名字。 function ButtonP...

陶小桃Blog 3万+

从贝叶斯网络到结构因果模型:因果推理在可解释AI中的实践

在机器学习和数据分析领域,理解变量间的因果关系而不仅仅是统计关联,是构建可信赖、可解释系统的关键。概率图模型,特别是贝叶斯网络,通过有向无环图和条件概率表,能够高效地编码和推理变量间的条件依赖关系,广泛应用于医疗诊断、风险评估等场景。然而,贝叶斯网络主要刻画的是“是什么”的关联,难以回答“如果…会怎样”的因果问题。为了进行因果推断,需要引入结构因果模型和do-演算,它们通过定义结构方程和模拟干预操作,能够区分混杂效应,估计处理变量对结果变量的净因果影响。这一套方法论对于可解释人工智能至关重要,它能生成反事实

weixin_42168902的博客 379

MySQL优化笔记

[url=http://dev.mysql.com/doc/refman/5.1/zh/optimization.html]MySQL 5.1参考手册 :: 7. 优化[/url] [b]一、查询优化[/b] 使用EXPLAIN [code] EXPLAIN tbl_name [/code] 返回Field、Type、Null、Key、Default、Extra这几列对应的表中每个...

hideto 157

计组实验4 控制冒险与分支预测

目录前言实验内容背景知识分支预测技术⭐阻塞周期计算方法不开启 BTB开启 BTBpart 1 矩阵乘法与优化未开启 BTB 的分析开启 BTB 的分析part 2 设计代码使 BTB 无效part 3 循环展开优化矩阵乘法未开启 BTB开启 BTB结束语结论 前言 上一篇博客:计组实验3 mips冒险之流水线冒险 摸了半个月了。。。咕咕咕 今天来写计组实验 4 这个实验非常简单,就是有点难。 这个实验比较容易算错,或者是被模拟器出人意料的结果搞的神神叨叨的,所以今天来记录并且详细分析该实验。 注:请务必阅

AKGWSB 's blog 5667

HPM Note1,Book Organization

How This Book Is Organization [b]A Broad Overview[/b] Ch1, MySQL Architecture [b]Building a Solid Foundation[/b] Ch2, Finding Bottlenecks: Benchmarking and Profiling Ch3, Schema Optimizatio...

hideto 157

绕过Google Play:获取Expo Go安卓APK的实用指南

本文为国内安卓开发者提供了绕过Google Play商店获取Expo Go APK的实用指南。针对无法访问Google Play的痛点,详细介绍了通过官方GitHub Releases、可信第三方网站(如APKMirror)及APK下载器等多种安全获取途径,并重点讲解了APK安装、安全验证(核对签名)及常见连接问题的排查方法,帮助开发者顺利开启React Native开发之旅。

weixin_29006701的博客 577

51单片机+HX711电子秤Proteus仿真保姆级教程(附完整源码与避坑指南)

本文详细介绍了51单片机与HX711电子秤在Proteus仿真中的全流程实战指南,包括电路设计、核心代码实现、典型问题排查及系统集成等关键步骤。特别提供了HX711驱动程序的编写技巧和称重数据处理算法,帮助开发者快速搭建高精度电子秤仿真系统,并避免常见的设计陷阱。

weixin_30752699的博客 413

华为云DCS全产品对比

华为云DCS产品的对比以及选型资料。

流水账 493

Plot3d 网格数据格式

PLOT3D是一个计算机图形程序,旨在可视化计算流体力学的网格和解决方案。PLOT3D文件可以是ASCII, 也可是Fortran unformatted 或 C binary形式。PLOT3D文件分为网格文件(XYZ 文件), 空气动力学结果文件 (Q 文件)和通用结果文件(函数文件 + 函数名称文件)。网格文件中可加入所谓的IBlank参数。

weixin_62592231的博客 3720
上一篇: HPM Note4, Schema Optimization and Indexing
下一篇: 轻量级开源BI简要设计
hidetobj
博客等级 码龄19年 16粉丝 301原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值