【MySQL】项目中常用的 18 条 MySQL 优化 打造高性能 SQL 语句

倒立摆入门详解+pid调参 倒立摆制作全过程 最近在练习pid的控制算法,就选用了2013年的电子设计国赛题目:倒立摆 。 首先给你们看看我的成果 注意哦:倒立摆不是靠上面黄色的传感器保持平衡的,而是通过下面的电机左右扭动使得摆杆不掉下来,难度可不小了。 材料准备 1.机械部分 如图所示选好电机和角位移传感器进行组装就好了,这个部分是我直接网上购买的,如果要自己装也是可以的,不过会比较麻烦,结构差不多的。 2.主控部分 这个部分的话完全是我自己设计的,作用和网上买的一样,因为网上买的话太贵了,有需要的话可以联系我,有pcb文件 阅读详情
1. 执行计划EXPLAIN

要想做MySQL优化,首先必须知道如何善用执行计划EXPLAIN。下图做个简单的示例并标注需要重点关注的数据。
在这里插入图片描述

  • type列,连接类型。一个好的sql语句至少要达到range级别。杜绝出现all级别
  • key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引方式
  • key_len列,索引长度
  • rows列,扫描行数。该值是个预估值
  • Extra列,详细说明。注意常见的不太友好的值有:Using filesort, Using temporary
    关于EXPLAIN的详细分析,可以阅读另一篇文章:
    【MySQL】执行计划EXPLAIN详解
2. SELECT语句务必指明字段名称

SELECT *增加很多不必要的消耗(cpu、io、内存、网络带宽);增加了使用覆盖索引的可能性;当表结构发生改变时,前断也需要更新。所以要求直接在select后面接上字段名。

3. 如果排序字段没有用到索引,就尽量少排序
4. 当只需要一条数据的时候,使用LIMIT 1

这是为了使EXPLAIN中type列达到const类型

5. SQL语句中IN包含的值不应过多

MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select id from table_name where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了;再或者使用连接来替换。

6. 如果限制条件中其他字段没有索引,尽量少用or

or两边的字段中,如果有一个不是索引字段,而其他条件也不是索引字段,会造成该查询不走索引的情况。很多时候使用 union all 或者是union(必要的时候)的方式来代替“or”会得到更好的效果

7. 尽量用union all代替union

union和union all的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算,加大资源消耗及延迟。当然,union all的前提条件是两个结果集没有重复数据。

8. 区分in和exists, not in和not exists
select * from 表A where id in (select id from 表B)

上面sql语句相当于

select * from 表A where exists
(select * from 表B where 表B.id=表A.id)

区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询。所以IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
关于not in和not exists,推荐使用not exists,不仅仅是效率问题,not in可能存在逻辑问题。如何高效的写出一个替代not exists的sql语句?
原sql语句

select colname … from A表
where a.id not in (select b.id from B表)

高效的sql语句

select colname … from A表 Left join B表 on
where a.id = b.id where b.id is null

取出的结果集如下图表示,A表不在B表中的数据
在这里插入图片描述

9. 分页查询时的优化
select id,name from table_name limit 86789520, 20

使用上述sql语句做分页的时候,可能有人会发现,随着表数据量的增加,直接使用limit分页查询会越来越慢。
优化的思路如下:我们知道主键是有索引的,根据主键先快速定位到大概位置,可以大大节约分页查询的效率。实际开发中,我们可以取前一页的最大行数的id,然后根据这个最大的id来限制下一页的起点。比如此例中,上一页最大的id是866612。sql可以采用如下的写法:

select id,name from table_name where id> 86789500 limit 20
10. 分段查询

在一些用户选择页面中,可能一些用户选择的时间范围过大,造成查询缓慢。主要的原因是扫描行数过多。这个时候可以通过程序,分段进行查询,循环遍历,将结果合并处理进行展示。
如下图这个sql语句,扫描的行数成百万级以上的时候就可以使用分段查询,如果不使用分段查询,数十亿条数据,即使有索引,查询的结果也十分缓慢。
在这里插入图片描述

11. 避免在 where 子句中对字段进行 null 值判断

对于null的判断会导致引擎放弃使用索引而进行全表扫描。

12.不建议使用%前缀进行模糊查询

例如LIKE "%keyword"或者LIKE "%keyword%",这种查询会导致索引失效而进行全表扫描。但是可以使用LIKE "keyword%"。如下图的执行计划结果,sku_name字段是有索引的,但是第二条语句的type是ALL,显然没有走索引。
在这里插入图片描述
在这里插入图片描述
那么对于模糊查询LIKE "%keyword%"如何走索引呢?答案是使用全文索引。
在我们使用

SELECT * FROM cps_commodity_info c WHERE c.sku_name LIKE '%辣%';

这样的查询语句时,普通索引是无法满足查询需求的,所幸在MySQL中,有FULLTEXT(全文索引)可以满足这个需求,但是需要注意的是使用全文索引的时候,SQL语句也有所不同:

SELECT * FROM cps_commodity_info c WHERE MATCH(c.sku_name) AGAINST ('辣' IN boolean MODE);

执行计划如图:
在这里插入图片描述
Tips:
需要特别注意的是,在创建FULLTEXT之前,请联系DBA确定是否能创建。同时需要注意查询语句的不同。另外,笔者不建议在开发中使用全文索引。

13. 避免在where子句中对字段进行表达式操作

比如:
在这里插入图片描述
可以看到,由于对主键进行了取余运算,导致引擎放弃了索引走了全表扫描。

14. 避免隐式类型转换

WHERE子句中出现 列字段的类型和传入的参数类型不一致的时候发生的类型转换,建议先确定WHERE中的参数类型。如下图所示,sku_id是varchar类型,查询条件是bigint类型时候就不会走索引,但是改成varchar类型就可以走索引了。
在这里插入图片描述
在这里插入图片描述
附上建表的SQL语句以供参考,可以看到sku_id字段是varchar类型。

CREATE TABLE `cps_commodity_info` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `sku_id` varchar(20) COLLATE utf8mb4_bin NOT NULL DEFAULT '0' COMMENT '商品skuId',
  `sku_name` varchar(100) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '商品名称',
  `price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '商品价格',
  `is_on_top` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否置顶,0:不置顶,1:置顶',
  `created_date` datetime NOT NULL COMMENT '创建时间',
  `modified_date` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `ldelete_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除标志,0:未删除,2:已删除',
  PRIMARY KEY (`id`),
  KEY `idx_sku_name` (`sku_name`) USING BTREE COMMENT '商品名称索引',
  KEY `idx_sku_id` (`sku_id`) USING BTREE COMMENT '商品skuId索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='cps商品信息';
15. 对于联合索引来说,要遵守最左前缀法则

举列来说索引含有字段id,sku_id,sku_name,可以直接用id字段,也可以采用id,sku_id这样的顺序,但是sku_id、sku_name就都无法使用这个索引。所以在创建联合索引的时候一定要注意索引字段顺序,一般的原则是最常用的查询字段放在最前面。

16. 注意范围查询语句

对于联合索引来说,如果存在范围查询,比如between,>,<等条件时,会造成后面的索引字段失效。

17. 必要时可以使用FORCE INDEX来强制查询走某个索引

有的时候MySQL优化器采取它认为合适的索引来检索sql语句,但是可能它所采用的索引并不是我们想要的。这时就可以采用force index来强制优化器使用我们制定的索引。

18. 关于连接查询JOIN的优化

如下图所示:

  • LEFT JOIN A表为驱动表
  • INNER JOIN MySQL会自动找出那个数据少的表作用驱动表
  • RIGHT JOIN B表为驱动表

在这里插入图片描述
尽量使用INNER JOIN ,避免LEFT JOIN。
参与联合查询的表至少为2张表,一般都存在大小之分。如果连接方式是INNER JOIN ,在没有其他过滤条件的情况下MySQL会自动选择小表作为驱动表,但是LEFT JOIN 在驱动表的选择上遵循的是左表驱动右表的原则,即LEFT JOIN左边的表为驱动表。
合理利用索引;被驱动表的索引字段作为ON的限制字段;利用小表去驱动大表。

19. 建表的时候字段尽可能使用NOT NULL

非NULL字段的处理要比NULL字段的处理高效些并且不需要判断是否为NULL。
NULL在MySQL中,不好处理,存储需要额外空间,运算也需要特殊的运算符。如SELECT NULL= NULL和SELECT NULL <> NULL(<>为不等号)有着同样的结果,只能通过IS NULL和IS NOT NULL判断字段是否为NULL。
MySQL中每条记录都需要额外的存储空间,表示每个字段是否为NULL。

从 Service Entry Sheet 按 PO 行项目追溯服务行:PACKNO 与 ESLL 层级解包实战 摘要: SAP MM模块中,外部服务采购的数据结构较为复杂,服务明细并非直接存储在采购订单行项目表EKPO中,而是通过PACKNO关联到服务包表ESLL。本文解析了从采购订单行项目EBELN+EBELP获取服务行号SRVPOS的方法,重点分析了服务包的层级结构(根包、子包SUB_PACKNO),并提供了兼容合同项目的ABAP代码实现。通过EKPO-PACKNO定位根包后,需结合ESUC和ESLL表逐层解析子包,最终获取服务明细数据,解决了服务采购场景下的数据关联难题。(149字) 阅读详情

相关推荐

别再乱调了!Zygo MetroPro软件滤波功能保姆级指南,从均值到鲁棒高斯样条一次讲清

本文深入解析Zygo MetroPro软件的滤波功能,从均值滤波到鲁棒高斯样条等九种算法,帮助用户根据测量对象特性选择最佳滤波组合。通过真实工业案例和参数配置指南,提升光学测量数据的准确性和效率,特别适用于硅晶圆、光学镜片等精密测量场景。

weixin_30888413的博客 156

MySQL性能优化篇之SQL语句优化

一般谈论性能优化是指查询性能的优化,导致查询慢的原因主要是访问的数据太多了。大部分性能低下的查询都可以通过减少访问的数据量的方法进行优化

永乐的博客 1401

行为验证码 AJ-Captcha 使用文档

AJ-Captcha验证码系统集成指南:需添加captcha-spring-boot-starter和Redis依赖,配置Redis连接。核心实现包括Redis缓存服务类CaptchaCacheRedisImpl(含设置、查询、删除验证码等方法)、SPI配置文件及Spring Boot配置类(配置验证码属性和Redis模板)。系统支持验证码生成、校验、防刷等安全功能,适用于Web应用安全验证场景。

千层冷面的博客 2115

mysql高性能sql语句_高性能MySQL

一、MySql逻辑架构图Client-----> 连接/线程处理器 ----> {[解析器]---->[查询缓存]}{解析器}----->优化器------>存储引擎information_schema(这张数据表保存了MySQL服务器所有数据库的信息)select * from INFORMATION_SCHEMA.[TABLES]SCHEMATA表:提供了关于数据...

weixin_42378094的博客 362

数字孪生变电站如何制作?虚拟现实项目强荐广州华锐互动

变电站数字孪生系统可以为提高变电站设备与环境的实时感知能力、在线诊断设备健康状态、促进设备隐藏故障定位和维修效率的提高、实现设备全生命周期提供有力支撑。通过对设备状态的准确评估,可以延长设备的生命周期,实现资产增值。1、3D可视化:建立可视化平台,集中展示所有3D模型信息、数据信息、环境信息和人员信息,包括设备数字模型、建筑外形及内部、周边地形、人员动态、天气、时间等。4、智能监控:采用先进的AI摄像头,通过设备的图像识别,自动智能分析图像,准确分析设备状态、运行动态、外围控制情况。...

gzvrnew的博客 775

STM32智能头盔DIY全攻略:从心率监测到跌倒报警的完整实现

本文提供了基于STM32的智能头盔完整DIY实现方案,涵盖从心率监测到跌倒报警的核心功能。详细解析了系统设计、硬件搭建、软件算法及系统联调,重点介绍了STM32主控、MAX30102心率传感器和MPU6050姿态传感器的应用,并分享了跌倒检测算法与功耗优化等实战经验,为嵌入式开发与物联网创新项目提供全面指导。

sony5的博客 500

mySQL数据库Sql语句执行效率检查--Explain命令

Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。 Explain语法:explain select … from … [where ...] 例如:explain select * from news; 输出:+----+------...

weixin_34178244的博客 1239

vue3接入大华摄像头

┃ ┃ ┣ 📜PlaybackModal.vue 回放列表模态框。┃ ┃ ┗ 📜VideoGrid.vue 视频播放区域。┃ ┃ ┣ 📜ControlPanel.vue 控制面板。┃ ┃ ┣ 📜DeviceList.vue 设备列表。┃ ┣ 📂module //大华摄像头文件。

💻 专注 Vue 前端与 Java 后端技术 🌱 目前正在深入 Spring Boot、微服务与性能优化 📝 定期分享实战踩坑经验与学习笔记 🤝 欢迎交流,共同进步 914

项目开发常用数据库SQL语句:通用SQL、MySQL、SQLServer、MyBatis

目录 数据库操作 1.完整数据库备份: 2.数据库还原: 3.新建数据库表 SQL语句 1.将mysql数据库中的一个表导入到另一个数据库表中 2.sqlserver 删除表中 指定字符串 3.sqlserver 将 “用 特定字符 分隔的一个字段” 拆分成多个字段,然后两个表之间数据更新 4.SQL like 模糊查询, in 5.SQL拼接 6.数据......

LaOngDaoxing的博客 2211

C#版OpenCV:OpenCVSharp 最详细最全面教程(万字详细总结)

OpenCVSharp 是一个用于 .NET 环境的 OpenCV 包装库,它提供了一种简便的方法来利用 OpenCV 的功能进行图像和视频处理。OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉和机器学习软件库,最初由 Intel 研发并发布。OpenCVSharp 让 C# 和其他 .NET 语言的开发者可以方便地访问 OpenCV 的强大功能。// 打印 OpenCV 版本信息Cv2。

仰望星空的博客 2万+

LPDDR6来了!到底比LPDDR5/5X强在哪?从速度到总线,技术细节一次说清!

LPDDR6不仅仅是速度快点、位宽大点那么简单,它是一次架构级的革新,从引脚、总线、时钟管理到Burst协议全部升级。🎯我们正在迈入一个“AI优先”的时代,内存架构也必须跟上。对于做芯片、做整机、做系统的你,理解LPDDR6的技术变化,提前规划测试方案,是现在就该启动的动作!

weixin_43199439的博客 1284

MySQL

MYSQL MYSQL基础yuf 登录 mysql -u root -p 退出 exit 创建数据库 CREATE DATABASE <> 删除数据库 drop database <> 选择数据库 use <> 创建数据表 CREATE TABLE (IF NOT EXISTS) 'table_name' (column_name column_type); 删除数据表 DROP TABLE table_name; ! 一定要有;结束符

Nicole_1_2_3的博客 230

【红绿灯识别】基于计算机视觉实现道路信号灯检测识别系统附Matlab代码

随着自动驾驶技术的快速发展,对道路交通信号灯的检测识别技术也提出了更高的要求。本文提出了一种基于计算机视觉的道路信号灯检测识别系统,该系统能够准确地检测和识别道路交通信号灯,并输出信号灯的颜色信息。该系统采用深度学习方法,利用卷积神经网络(CNN)对道路交通信号灯进行检测和识别。实验结果表明,该系统能够在复杂的环境中准确地检测和识别道路交通信号灯,具有较高的实用价值。道路交通信号灯是道路交通管理的重要组成部分,它能够有效地组织交通,提高道路通行效率,保障交通安全。

qq_59747472的博客 339

【50条常用MySQL语句】如果这50条sql语句你都不熟,你别说你会MySQL【建议收藏】

50条SQL查询技巧、查询语句示例 这篇文章主要介绍了50条SQL查询技巧、查询语句示例,本文以学生表、课程表、成绩表、教师表为例,讲解不同需求下的SQL语句写法,需要的朋友可以参考下 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 1、查询“001”课程比“002”课程成绩高的所有学生的学号; select a.S# from (select s.

zhulin1028的博客 2万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

MySQL常用的sql语句

SQL语句核心功能与实用技巧摘要: SQL语句主要分为四类:数据查询(SELECT)、数据操作(INSERT/UPDATE/DELETE)、数据定义(CREATE/ALTER)和数据控制(GRANT/COMMIT)。基础查询包括条件筛选、排序分页和聚合分组,多表连接可实现复杂关联查询。DML语句完成增删改操作,DDL定义数据库结构,DCL管理权限事务。高级技巧包含子查询、CTE和窗口函数,优化建议着重索引创建和查询效率提升。掌握这些语句可高效完成数据检索、业务逻辑实现和性能优化,是数据库操作的核心技能。

simpler0808的博客 1672

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

老司机介绍的18条SQL优化方案

/最好在bid上建索引。用小结果集驱动大结果集,将筛选结果小的表(在决定哪个表做驱动表的时候,应该是两个表按照各自的条件过滤,过滤完成之后,计算参与join的各个字段的总数据量,数据量小的那个表,就是“小表” )首先连接,再去连接结果集比较大的表,尽量减少join语句中的Nested Loop的循环总次数。Mysql查询优化器会对查询的字段进行改进,判断查询的字段以哪种形式组合能使得查询更快,所有比如创建的是(a,b)索引,查询的是(b,a),查询优化器会修改成(a,b)后使用索引查询。

xiaoli8748的专栏 1619

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

MySql 常用SQL语句、 SQL优化

SQL语句主要分为五类:数据定义语言(DDL)用于管理数据库结构,数据查询语言(DQL)用于检索数据,数据操纵语言(DML)用于增删改数据,数据控制语言(DCL)用于权限管理,事务控制语言(TCL)用于事务管理。键约束方面,超键能唯一标识行,候选键是最小超键,主键是选定的候选键,外键则关联表间数据。SQL约束包括非空、唯一、主键、外键、检查及默认值约束,确保数据完整性。

weixin_44289947的博客 1333

MySQL优化书写高质量sql语句

1. 查询SQL尽量不要使用全查 select *,而是 select + 具体字段。 反例: select * from student; 正例: select id,name, age from student; 理由: 只取需要的字段,可以节省资源、减少CPU和IO以及网络开销。 select * 进行查询时,无法使用到覆盖索引,就会造成回表查询。 使用具体字段可以减少表结构变动带来的影响。 2. 使用预编译语句进行数据库操作 理由: 预编译语句可以重复使用计划,减少SQL编译所需要

Java小皮孩 1万+

130条必背SQL常用语句

存储过程是“预编译的SQL集合”,存储在数据库中,适用于:封装复杂业务逻辑(如:多步查询+计算)、减少网络传输(客户端只需调用过程名,无需传输长SQL)、权限控制(可单独授予存储过程执行权限,不开放表访问)。:函数与存储过程类似,但主要区别是“函数必须返回值,且只能用于查询语句中”,用在“基于输入参数计算并返回单一结果”的场景(如:数据格式化、值转换、简单统计),不能用于执行插入/更新/删除操作(存储过程可以)。删除前需确认索引无查询依赖。

m0_68728226的博客 1276

SQL语句优化技巧

数据库性能优化涉及到很多方面,在数据库开发时可以通过以下一些基本的sql优化技巧提高数据库的性能。

棉花糖老丫 866

MySQL14 - 调优之SQL语句的优化

MySQL14 - 调优之SQL语句的优化

qq_43350524的博客 1181

【MySQL】47 条SQL语句性能优化策略

你知道的越多,你不知道的越多!

天天新知 751

MySQL的52条SQL语句性能优化

MySQL的52条SQL语句性能优化 1 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2 应尽量避免在 where 子句中对字段进行 null 值判断,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默 认值。 3 应尽量避免在 where 子句中使用!=或<>操作符, MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某

yuanchangliang的博客 346

mysql数据库sql语句的一些常用优化方法

1.应尽量避免在 where 子句中使用!=或 2.对在where中常用的字段,可以适当建立合适的索引。 通常在mysql数据库中,为一个表中加入索引,代码格式为:ALTER TABLE ADD INDEX (); 例如:alter table test add index(t_name);         可以通过describe  table_name来查看表中索引等情况。 3

縌时针的博客 1602

Mysql常用sql语句

目录 1 SQL 语法基础 2 创建数据库 3 删除数据库 4 MySQL 数据类型 5 数值类型 6 字符串类型 7 日期和时间类型 8 创建表 9 查询表 10 删除数据表 11 添加,删除,更新字段 12 查询 & 条件查询 13 简单的操作符 14 插入数据 15 更新数据 16 删除数据 17 LIKE 操作符 18 UNION 操作符 19 ORDER BY 子句 20 GROUP BY 语句 21 链接的使用 1 SQL 语法基础 MySQ

赵广陆 1183

【MySQL】 # 优化你的SQL语句

1. 查询SQL尽量不使用 select *,而是 select 具体字段 正确使用: SELECT id, name FROM student; 反例: SELECT * FROM student; 只取需要的字段,节省资源 select * 进行查询时,很可能不会使用到覆盖索引,造成回表查询 2. 如果知道查询结果只有一条,或者只要最大/最小一条,建议用 limit 1 正确使用: SELECT id, name FROM student WHERE name = '张三' limit 1; 反

LRcoding 2516
上一篇: 【并发编程】ThreadLocal 的原理分析和最佳实践
下一篇: 【EasyExcel】Java使用EasyExcel操作Excel文档
少侠露飞
博客等级 码龄9年 214粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值