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

Mysql sql技巧与优化

1、解决mysql同时更新、查询问题

在这里插入图片描述

2、控制查询优化 hint

在这里插入图片描述

3、 优化 特定类型的查

优化 COUNT() 查询

在这里插入图片描述
使用 近似值
业务能接受近似值的话,使用explain拿到近似值

在这里插入图片描述

优化关联查询

在这里插入图片描述

优化子查询

在这里插入图片描述

4、优化group by和distinct

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

优化GROUP BY WITH ROLLUP

在这里插入图片描述

在这里插入图片描述

5、优化 limit分页

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其他优化法办 包括还 使用预先计算的汇总表,或关联者 到一个冗余表,冗余表只包含主键列和需要做排序数据。

6、优化SQL_CALC_FOUND_ROWS

在这里插入图片描述
说明

  • SQL_CALC_FOUND_ROWS 会告诉 MySQL 在执行 SELECT 查询时计算总行数,而不管 LIMIT 子句。
  • FOUND_ROWS() 函数会返回上一个 SELECT
  • SQL_CALC_FOUND_ROWS 查询的总行数。

注意事项

  • SQL_CALC_FOUND_ROWS 在大表或复杂查询中可能会导致性能问题,因为它会强制 MySQL 计算总行数。
  • 使用 SQL_CALC_FOUND_ROWS 和 FOUND_ROWS() 的组合可能会被替代方案所取代,例如先执行 COUNT(*) 查询,然后再执行带 LIMIT 的查询,这样可能会更高效。

7、优化 UNION 查询

在这里插入图片描述

8、静态查询分析

在这里插入图片描述

9、如何判断sql较优 explain

在这里插入图片描述
如上图所示,用户可以通过Explain判断语句是否已最优,其中Type与Extra的主要类型与含义如下:

Type

1)ALL:Full Table Scan 全表扫描;
2)index: Full Index Scan,索引扫描;
3)range:索引范围扫描;
4)ref: 表示非唯一索引 连接匹配条件;
5)eq_ref: 类似ref,区别就在使用的索引是唯一索引;

用法:当一个表有一个唯一索引,并且该索引中的所有字段都被用于连接条件时,会使用eq_ref。

SELECT * FROM orders
JOIN customers ON orders.customer_id = customers.customer_id;

在这个例子中,如果customers.customer_id是一个唯一键或主键,并且在orders.customer_id上有索引,那么可能会使用eq_ref访问方法

6)const: 常量查询,比如pk等值;
用法:当表中有一个主键或唯一索引,并且查询条件使用了常量值时,会使用const。

SELECT * FROM customers WHERE customer_id = 1;

在这个例子中,如果customer_id是主键或唯一索引,那么可能会使用const访问方法。

7)system是Const类型的特例;当查询的表只有一行的情况下,使用system。

从性能角度来看,从上往下性能越来越高,一般要求是到Range范围扫描。

Extra

1)Using filesort 排序;
表示查询需要进行文件排序。通常在 ORDER BY 子句中未使用索引时会出现。这通常是一个性能问题的信号,因为文件排序可能比较耗时。

2)Using index 使用索引可以返回请求列
3)Using index condition 通过索引初步过滤;回表再过滤其它条件;
4)Using temporary 临时表;
表示查询需要使用临时表来存储中间结果。通常在涉及 GROUP BY、ORDER BY 或者某些复杂的查询时会出现。

5)Using where 单独出现时;一般代表表上出现全表扫描过滤;
6)Using index & Using where 使用索引返回数据;同时通过索引过滤。

Extra反映了执行计划的真实执行情况。

在这里插入图片描述

结合上图执行计划分析,C表是外部驱动表,索引方式为idx_pk,Type是Range,Extra有Using index condition、Using where以及Using MRR,
表示进行全表扫描,通过索引初步过滤,回表B再过滤其他条件。B表是从外表取数据做内循环,索引方式为i_text,扫描的列为c.b.KeyNo,这种情况说明这个执行计划相对完善。

10、sql优化建议

禁止项

1)select *,返回无用数据,过多IO消耗,以及Schema 变更问题;
2)Insert语句指定具体字段名称,不要写成insert into t1 values(…),道理同上;
3)禁止不带WHERE,导致全表扫描以及误操作;
4)Where条件里等号左右字段类型必须一致,否则可能 会产生隐式转换,无法利用索引;
5)索引列不要使用函数或表达式,否则无法利用索引。
如where length(name)=‘Admin’或where user_id+2=5;
6)Replace into,会导致主备不一致;
7)业务语句中带有DDL操作,特别是Truncate。

建议项

1)减小三表以上Join;
2)用Union all 替代Union;
3)使用Join 替代子查询;
4)不要使用 like ‘%abc%’,可以使用 like ‘abc%’;
5)Order by /distinct /group by 都可以利用索引有序性;
6)减少使用event/存储过程,通过业务逻辑实现;
7)减小where in() 条件数据量;
8)减少过于复杂的查询和拼串写法。

11、mysql整体注意事项

在这里插入图片描述
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux环境下MongoDB安装与主从集群,高可用集群配置教程
  • Training for Stable Diffusion
  • SQL labs靶场-SQL注入入门
  • Linux openEuler_24.03部署MySQL_8.4.0 LTS安装实测验证安装以及测试连接全过程实操手册
  • 向量化操作
  • ELK企业级日志分析
  • Docker安装nacos(详细教程)
  • Linux-查看dd命令进度
  • layui自定义defaultToolbar 新增按钮 隐藏列表操作栏浮动部分
  • 山东航空小程序查询
  • C++ 栈( stack )学习
  • Element UI DatePicker选择日期范围区间默认显示前一个月和本月
  • Java字符串中的第一个唯一字符
  • Python机器学习入门:从理论到实践
  • 信号【Linux】
  • [译]前端离线指南(上)
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Druid 在有赞的实践
  • JS专题之继承
  • Node + FFmpeg 实现Canvas动画导出视频
  • RxJS: 简单入门
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 解决iview多表头动态更改列元素发生的错误
  • 前端技术周刊 2019-02-11 Serverless
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # centos7下FFmpeg环境部署记录
  • #WEB前端(HTML属性)
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (八)Spring源码解析:Spring MVC
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (七)理解angular中的module和injector,即依赖注入
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (一)Docker基本介绍
  • (转)人的集合论——移山之道
  • (转)项目管理杂谈-我所期望的新人
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .Net Core 笔试1
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 解决重复提交问题
  • .NET程序员迈向卓越的必由之路
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • ?.的用法
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录