MySQL之SQL优化

用MySQL MCP 优化 SQL实战 最近几天都在优化之前的 SQL,一看 SQL 都是 5-6 个表连表还有各种子查询,看起来主打一个头大。正常的优化思路心路历程分享一下: 首先是查看每一个表的数据,根据表数据查询是否存在合理,然后根据数据量进行连表查询,由少到多的一个过程,尽可能减少表的行数,然后再根据对应的数据是否有索引覆盖。为什么要用 MCP?因为用 MYSQL MCP 可以减少自己对于字段的识别和查询,以及索引是否覆盖。 阅读详情

今天参加了公司内部的培训,感想wangqiang带来的技术分享。我又结合公司wiki,记录下mysql优化的一些知识。

show warnings

官方解释

SHOW WARNINGS is a diagnostic statement that displays information about the conditions (errors, warnings, and notes) resulting from executing a statement in the current session.
Warnings are generated for DML statements such as INSERT, UPDATE, and LOAD DATA INFILE as well as DDL statements such as CREATE TABLE and ALTER TABLE.

示例

Here is a simple example that shows data-conversion warnings for INSERT: 【mysql版本不同,可能有些不一样】

mysql> CREATE TABLE t1 (a TINYINT NOT NULL, b CHAR(4));
    Query OK, 0 rows affected (0.05 sec)
mysql> INSERT INTO t1 VALUES(10,'mysql'), (NULL,'test'), (300,'xyz');
    Query OK, 3 rows affected, 3 warnings (0.00 sec)Records: 3  Duplicates: 0  Warnings: 3
mysql> SHOW WARNINGS\G
*************************** 1. row ***************************  
Level: Warning   Code: 1265Message: Data truncated for column 'b' at row 1
*************************** 2. row ***************************  
Level: Warning   Code: 1048Message: Column 'a' cannot be null
*************************** 3. row ***************************  
Level: Warning   Code: 1264Message: Out of range value for column 'a' at row 33 rows in set (0.00 sec)

和sql优化有什么关系?

mysql有时候会修改执行的sql,导致性能问题,show warnings可以查看真正执行的sql语句。

使用【explain或desc命令 sql语句】,我们可以看到某SQL语句的执行计划,desc命令并不是通用,所以我们使用explain sql语句 更多一些。

  执行Mysql的explain extended的输出会比单纯的explain多一列filtered(MySQL 5.7缺省就会输出filtered),它指返回结果的行占需要读到的行(rows列的值)的百分比。按说filtered是个非常有用的值,因为对于join操作,前一个表的结果集大小直接影响了循环的次数。
  filtered值只对index和all的扫描有效(这可以理解,其它场合,通常rows值就等于估算的结果集大小。)

使用show table status;可以提供每个表的大量信息,本语句也显示视图信息。
SHOW TABLE STATUS [from db_name] //所指数据库中所有表的信息
SHOW TABLE STATUS [from db_name] LIKE ‘uc%’ //表名以uc开头的表的信息

另外,补充一小点,我们可能看SQL语句的时候,通常看到很多会在后边加上一个参数\G,如select * from user \G; 该参数会自动在命令行下进行格式化输出,便于我们阅读。自行尝试。

示例

mysql> explain EXTENDED SELECT  * FROM  order t1 where t1.order_id in (select order_id from order)
结果:
| id | select_type | table            | type   | possible_keys          | key     | key_len | ref             | rows    | filtered | Extra       |
+----+-------------+------------------+--------+------------------------+---------+---------+-----------------+---------+----------+-------------
|  1 | SIMPLE      | t1               | ALL    | PRIMARY,order_id_index | NULL    | NULL    | NULL            | 1093303 |   100.00 | NULL        |
+----+-------------+------------------+--------+------------------------+---------+---------+-----------------+---------+----------+-------------
|  1 | SIMPLE      | order | eq_ref | PRIMARY,order_id_index | PRIMARY | 4       | ord.t1.order_id |       1 |   100.00 | Using index |
+----+-------------+------------------+--------+------------------------+---------+---------+-----------------+---------+----------+-------------
2 rows in set, 1 warning (0.00 sec)

mysql> SHOW WARNINGS\G
*************************** 1. row **************************
Level: Note
Code: 1003
Message: /* select#1 */ select `ord`.`t1`.`order_id` AS `order_id`,`ord`.`t1`.`order_num` AS `order_num`,`ord`.`t1`.`pay_status` AS `pay_status`,`ord`.`t1`.`cur
rent_status` AS `current_status`,`ord`.`t1`.`source` AS `source`,`ord`.`t1`.`member_id` AS `member_id`,`ord`.`t1`.`is_sub` AS `is_sub`,`ord`.`t1`.`parent_order_
id` AS `parent_order_id`,`ord`.`t1`.`process_id` AS `process_id`,`ord`.`t1`.`process_status` AS `process_status`,`ord`.`t1`.`priority` AS `priority`,`ord`.`t1`.
`add_uid` AS `add_uid`,`ord`.`t1`.`add_time` AS `add_time`,`ord`.`t1`.`update_uid` AS `update_uid`,`ord`.`t1`.`update_time` AS `update_time`,`ord`.`t1`.`del_fla
g` AS `del_flag`,`ord`.`t1`.`sign_status` AS `sign_status`,`ord`.`t1`.`valid_status` AS `valid_status`,`ord`.`t1`.`release_time` AS `release_time`,`ord`.`t1`.`p
ay_amount` AS `pay_amount`,`ord`.`t1`.`bind_orderId` AS `bind_orderId`,`ord`.`t1`.`follow_up_status` AS `follow_up_status`,`ord`.`t1`.`follow_up_time` AS `follo
w_up_time`,`ord`.`t1`.`end_status` AS `end_status`,`ord`.`t1`.`has_confirmed` AS `has_confirmed`,`ord`.`t1`.`visa_cfm_result` AS `visa_cfm_result`,`ord`.`t1`.`d
istribution_tag` AS `distribution_tag` from `ord`.`phoenix_ru_order` join `ord`.`phoenix_ru_order` `t1` where (`ord`.`phoenix_ru_order`.`order_id` = `ord`.`t1`.
`order_id`)
1 row in set (0.00 sec)

可以看到mysql 自动将in优化成了表关联

相关子查询

索引

执行计划

神领物流-day01-项目概述 公司从2019年开始业务快速扩张,网点数量从138家扩展至540家,车辆从170台增长到800台。同时,原有的系统非常简单,比如车辆的调度靠人工操作、所有的货物分拣依靠人员,核心订单数据手动录入,人效非常低。随着业务不断演进,技术的不断提升,原有运输管理系统已无法满足现有快速扩展下的业务需求,但针对现有系统评估后发现,系统升级成本远高于重新研发。因此,公司决定基于现有业务体系进行重新构建,打造一套新的TMS运输系统,直接更替原有系统。 阅读详情

相关推荐

告别Vysor!用Scrcpy在Mac上无线投屏安卓手机(附魅族16th闪退修复实战)

本文详细介绍了如何在Mac上配置和使用开源投屏工具Scrcpy,实现安卓手机无线投屏的高效解决方案。从基础环境准备到高级功能调优,包括无线连接配置、输入控制增强、多设备管理和性能优化等实用技巧,特别针对魅族16th等机型的闪退问题提供了修复方案,帮助用户彻底告别Vysor等商业软件。

weixin_28712661的博客 394

修改或更新数据库,提示Data truncated for column ‘字段名‘ at row 1 的原因及解决方法

修改或更新数据库,提示Data truncated for column ‘字段名‘ at row 1 的原因及解决方法

qq_43070236的博客 12万+

STM32CubeMX 6.4.0 + STM32F407ZGT6 实战:基于YT8512C PHY的lwIP以太网配置与调试

本文详细介绍了使用STM32CubeMX 6.4.0为STM32F407ZGT6微控制器配置YT8512C PHY芯片,并成功移植lwIP以太网协议栈的实战过程。文章从硬件差异分析入手,逐步讲解时钟配置、ETH外设设置、PHY寄存器适配以及lwIP协议栈剪裁等关键步骤,旨在帮助开发者解决非标准PHY芯片的联网难题,最终实现网络连通与Ping测试。

n8m7b6v5c4的博客 593

mysql导入文件出现Data truncated for column 'xxx' at row 1的原因

"\r\n"是出现Data truncated for column 'xxx' at row 1的重要原因

ljhandlwt 9万+

基于STM32 FOC下桥三电阻采样方式的电机相电流重构方法

如何提高三电阻采样的调制率

wanrenqi的博客 9193

STM32H5 USB虚拟串口:用Classic驱动移植CDC实践

USB虚拟串口(CDC)是嵌入式系统最常用的主机通信方式之一,本质是借助USB协议模拟串口收发,无需额外驱动即可在PC上生成COM口。其实现依赖USB设备协议栈完成枚举、控制传输与批量传输。传统USBD Classic库不依赖RTOS,代码轻量、调用链短,非常适合裸机或轻量状态机架构;而USBX功能强大但需要ThreadX内核,资源开销较大。在电机控制器、传感器采集等场景中,日志输出与参数配置仅需简单的双向数据通道,Classic驱动往往更务实。本文基于STM32H5平台,详细梳理了使用Classic驱动移

weixin_29178069的博客 334

有关data truncated for column at row 1 问题的解决

有关data truncated for column at row 1 问题的解决 有关问题的截屏: 这问题大概的意思是,数据库这一列数据被截断,请检查一下数据库该字段的类型和长度,检查数据精度长度是否符合规则。 此时进入数据库查看表结构: 具体操作步骤如下: show databases; use auto_store; show tables; desc autoparts; 按步骤依次输入下面指令:前提是已经进入到数据库。 效果图: ...

weixin_52270236的博客 2万+

手动测试台架搭建,让你的车载测试更轻松

如果你也在经常进行车载测试,就知道有时候手头的设备并不能完全满足需求。 在我之前的测试中,发现了一些问题,但是却找不到根本原因。于是,我开始思考如何打造一个更为完美的手动测试台架,让测试变得更加轻松。 经过不断地实践和调试,我终于成功搭建出了一个能够满足自己需求的测试台架。现在,我想和大家分享这个搭建的经验,希望能够帮助到在车载测试领域工作的小伙伴们,让你们的测试更加准确、高效!

weixin_67553250的博客 1万+

出现 Data truncated for column 'date' at row 1 的错误解决方案

  严重: Servlet.service() for servlet [spring-mvc] in context with path [/DBDX] threw exception [Request processing failed; nested exception is com.dbdx.util.DaoException: 数据库操作失败!; nested exception is...

格调的博客 16万+

001-基础入门-Web演示源码&资源&工具箱等

小迪安全2023笔记

wushangyu32335的博客 4260

逆向实战:如何绕过iTunes 12.6.5.3的反调试机制(附X64dbg插件配置)

本文深入剖析了iTunes 12.6.5.3的反调试机制与登录协议。通过X64dbg动态调试与IDA静态分析,详细演示了如何绕过其反调试检测,并定位到核心的登录协议加密函数,揭示了其请求签名(X-Apple-ActionSignature)的生成逻辑与依赖关系,为客户端安全研究与协议分析提供了实战思路。

weixin_29202213的博客 742

MySQL-SQL优化

MySQL性能调优的相关知识,包括SQL性能分析和SQL优化等。

m0_53222084的博客 3833

RT-DETR的AIF模块+YOLOv8:融合注意力与特征交互,打造实时检测的科研级进阶方案

从理解AIF模块“细粒度注意力+跨尺度交互”的核心设计,到亲手将其嵌入YOLOv8并验证在复杂场景的表现,再到基于此探索属于自己的科研与工程方向——这个过程能让你深刻理解“注意力机制与CNN融合”在实时检测中的核心价值。现在就开始行动,相信你会在实时目标检测的“智能进化”之路上,走出一条属于自己的技术路径。从实验对比图可见,集成AIF模块的YOLOv8,其mAP(平均精度)在多个阈值下均有提升,尤其是mAP50-95(高IoU阈值下的精度)提升更为显著,充分证明了AIF对细粒度特征的捕捉能力。

m0_64661770的博客 188

【MySQL进阶教程】SQL优化

本文为 【MySQL进阶教程】SQL优化相关知识,下边将对主键优化,order by优化,group by优化,limit优化,count优化,update优化等进行详尽介绍~

小新要变强的博客 4151

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

MySQL——SQL优化

SQL优化是提升数据库性能的关键。本文总结了17个SQL优化技巧,包括避免SELECT*、使用UNION ALL代替UNION、小表驱动大表、批量操作、合理使用LIMIT等查询优化方法。同时介绍了索引优化原则、数据库结构优化策略,以及如何通过执行计划分析、分页优化、配置调整等提高性能。文章还强调了避免大事务、使用存储过程等建议,并指出SQL优化需要结合具体业务场景持续进行。通过遵循这些优化策略,可以显著提升查询效率和数据库整体性能。

hj945218的博客 1054

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

MySQL 索引及SQL优化

MySQL 索引设计及失效情况,SQL优化

青竹暖回阳的博客 2318

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

MySQL慢SQL优化方案汇总

在 MySQL 5.0 之前的版本要尽量避免使用 or 查询,可以使用 union 或者子查询来替代,因为早期的MySQL版本使用 or 查询可能会导致索引失效,高版本引入了索引合并,解决了这个问题,不过建议大家在实际使用中还是规范写法,能不用就少用。尽量使用 Join 语句来替代子査询,因为子査询是嵌套查询,而嵌套查询会新创建一张临时表,而临时表的创建与销毁会占用一定的系统资源以及花费一定的时间,同时对于返回结果集比较大的子查询,其对查询性能的影响更大。任何问题评论区或私信讨论,欢迎指正。

2401_84479435的博客 2027

MySQL SQL优化过程

本文旨在深入探讨MySQL SQL优化的过程,从基础概念到高级技巧,通过多个代码示例,帮助初学者和有经验的开发者掌握SQL优化的核心策略。通过上述步骤和技巧,你可以逐步提升自己的SQL技能,使你的应用在面对日益增长的数据量时仍然保持高性能。希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身农奴把歌唱,数据库的性能会随数据量增长而变化,定期执行查询分析和优化是必要的。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 946

MySQL优化之SQL优化详解

sql优化详解

个人博客,欢迎收藏。 1591

SQL基础——MySQL的优化

本文介绍了sql的优化,包括查看Sql执行效率,explain分析执行计划,show profile分析SQL,trace分析优化器执行计划,使用索引优化,优化order by语句,优化group by,优化子查询,优化limit查询

m0_66890670的博客 1420

mysql 怎么优化慢sql

其实在实际的项目中,给sql加上合适的索引一般就能解决90%的问题,也是sql优化最主要的手段和方向,当然如果项目比较特殊或者数据量较大,或者已经加了合适的索引,那可能要考虑对症下药,例如采用分库分表、增加redis缓存、增加服务端接口缓存等手段。我们可以看到刚才的explain语句中,type返回的是ALL,表示我们的这条sql走的是全表扫描,没有走索引。如果是绿色的类型就表示用到了合适的索引,不需要从索引层面考虑优化,如果是黄色的表示尚可接受,还可以继续优化,如果是红色的部分,表示sql急需优化。

qq_42476938的博客 1334

MySQL的SQL优化

在之前的测试中,我们发现,如果数据量很大,在执行count操作时,是非常耗时的。MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高;但是如果是带条件的count,MyISAM也慢。InnoDB 引擎就麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。

skjdnn的博客 795

【MySQL高级】优化SQL步骤

在应用的的开发过程中,由于初期数据量小,开发人员写 SQL 语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多 SQL 语句开始逐渐显露出性能问题,对生产的影响也越来越大,此时这些有问题的 SQL 语句就成为整个系统性能的瓶颈,因此我们必须要对它们进行优化,本章将详细介绍在。通过以上步骤查询到效率低的 SQL 语句后,可以通过 EXPLAIN或者 DESC命令获取 MySQL如何执行 SELECT 语句的信息,包括在 SELECT 语句执行过程中表如何连接和连接的顺序。

dzqxwzoe的博客 911

mysql性能优化-SQL 查询优化

MySQL 查询优化是数据库性能优化的重要环节。通过合理使用索引、优化查询语句和设计表结构,可以显著提高 MySQL 的查询性能。

Flying_Fish_roe的博客 2081

mysql sql优化_MYSQL SQL优化总结

MySQL日常维护中,性能瓶颈是每个运维人员都头疼的问题之一,那么该如何有效解决这个问题呢?慢SQL问题则是重中之重。因此本文重点讲解的是从慢日志的抓取、执行计划的解读、优化的原则到各种类型的案例解析等方面来全方位的讲解慢SQL优化。[慢SQL获取方式]1、开启慢查询实时获取有性能问题的SQL,数据库参数设定如下:2、慢日志解析(需提前安装PT工具):pt-query-digest slow.lo...

weixin_31317351的博客 129

基于mysql的sql优化方法_基于MySQL 的 SQL 优化总结

基于MySQL 的 SQL 优化总结在数据库运维过程中,优化 SQL 是 DBA 团队的日常任务。例行 SQL 优化,不仅可以提高程序性能,还能减低线上故障的概率。目前常用的 SQL 优化方式包括但不限于:业务层优化、SQL 逻辑优化、索引优化等。其中索引优化通常通过调整索引或新增索引从而达到 SQL 优化的目的。索引优化往往可以在短时间内产生非常巨大的效果。--- 来自美团技术团队SQL 优化是...

weixin_39950470的博客 94
上一篇: mybaits中的<trim>标签的作用
下一篇: Random的使用
长青的历练
博客等级 码龄12年 2粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值