MySQL优化第二篇

MySQL优化第二篇

    • 性能分析
    • 小表驱动大表
      • 慢查询日志
      • 日志分析工具mysqldumpslow
    • Show Profile进行SQL分析(重中之重)

七种JOIN

1、inner join :可以简写为join,表示的是交集,也就是两张表的共同数据

sql语句:select * from tbl_emp e inner join tbl_dept d on e.deptId=d.id
在这里插入图片描述

2、left join (左外连接):从集合上看就是A 、B 的交集加上A的私有,即左表的所有数据加上 左右表中相交的数据

sql 语句:select * from tbl_emp e left join tbl_dept d on e.deptId=d.id

在这里插入图片描述

前七条共有数据;第八条a表独有数据,b表补null

3、right join(右外连接,全B):前七条共有数据;第八条b表独有数据,a表补null

4、左join独A:就是A表独有的部分,在left join的基础上加上where条件

sql语句:select * from tbl_emp e left join tbl_dept d on e.deptId=d.id where d.id is null

在这里插入图片描述

5、右join独B:就是B表的独有部分,同理可知在right join的基础上加上where条件

6、full join (全外连接):MySQL不支持使用full join 如果想要实现全A+B可以使用union去重中间部分(union关键字可以合并 并且 去重

sql语句:

select * from tbl_emp a left join tbl_dept b on a.deptId=b.id
union
select * from tbl_emp a right join tbl_dept b on a.deptId=b.id

在这里插入图片描述

7、A、B各自独有集合

select * from tbl_emp a left join tbl_dept b on a.deptId=b.id where b.id is null
union
select * from tbl_emp a right join tbl_dept b on a.deptId=b.id where a.deptId is null

在这里插入图片描述

性能分析

MySQL Query Optimizer(查询优化器)[ˈkwɪəri] [ˈɒptɪmaɪzə]
Mysql中专门负责优化SELECT语句的优化器模块,主要功能:通过计算分析系统中收集到的统计信息,为客户端请求的Query提供他认为最优的执行计划(他认为最优的数据检索方式,但不见得是DBA认为是最优的,这部分最耗费时间)

当客户端向MySQL请求一条Query,命令解析器模块完成请求分类,区别出是SELECT并转发给MySQL Query Optimizer时,MySQL Query Optimizer首先会对整条Query进行优化,处理掉一些常量表达式的预算直接换算成常量值。并对Query中的查询条件进行简化和转换,如去掉一些无用或显而易见的条件、结构调整等。然后分析Query 中的 Hint信息(如果有),看显示Hint信息是否可以完全确定该Query的执行计划。如果没有Hint 或Hint信息还不足以完全确定执行计划,则会读取所涉及对象的统计信息,根据Query进行写相应的计算分析,然后再得出最后的执行计划

小表驱动大表

exists语法:SELECT * FROM table WHERE EXISTS (subquery)

该语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE或FALSE)来决定主查询的数据结果是否得以保留

优化原则:

小表驱动大表,即小的数据集驱动大的数据集

就比如大表是A 小表是B

1、当B表的数据集必须小于A表的数据集的时候,用in会比用exists好

2、当A表的数据集是小于B表的数据集的时候,用exists会比较好

重点:A表与B表的id字段应该建立索引

in和exists的用法

sql语句:

select * from tbl_emp e where e.deptId in (select id from tbl_dept d)

select * from tbl_emp e where EXISTS (select 1 from tbl_dept d where e.deptId=d.id)

在这里插入图片描述

慢查询日志

MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,**具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10秒以上的语句。由他来查看哪些SQL超出了我们的最大忍耐时间值,比如一条sql执行超过5秒钟,我们就算慢SQL,希望能收集超过5秒的sql 结合之前explain进行全面分析

操作说明:

默认情况下,MySQL数据库没有开启慢查询日速,需要我们手动来设置这个参数

但是开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件。

查看是否开启以及如何开启慢查询

默认: SHOW VARIABLES LIKE ‘%slow_query_log%’;

开启:set global slow_query_log=1;,只对当前数据库生效,如果MySQL重启后则会失效

永久开启:就必须修改配置文件my.cnf文件,将下面两行的数据配置进文件中

slow_query_log =1
slow_query_log_file=/var/lib/mysqatguigu-slow.log

重点:关于慢查询的参数slow_query_log_file,它指定慢查询日志文件的存放路径,系统默认会给一个缺省的文件host_name-slow.log(如果没有指定参数slow_query_log_file的话

查看慢sql阈值时间:即查看long_query_time的值。

查看命令是:SHOW VARIABLES LIKE ‘long_query_time%’;

修改命令是:set global long_query_time=3;

查询当前有多少慢查询sql:show global status like ‘%Slow_queries%’

重点:如果显示修改无效的话可以重开一个连接,或者换一个语句:show global variables like ‘long_query_time’;

日志分析工具mysqldumpslow

在生产环境中,如果要手工分析日志,查找、分析SQL,是非常复杂且麻烦的,MySQL提供了日志分析工具mysqldumpslow

查看mysqldumpslow的帮助信息,mysqldumpslow --help

常用mysqldumpslow帮助信息:

s是表示按照何种方式排序
c访问次数
l锁定时间
r返回记录
t查询时间
al平均锁定时间
ar平均返回记录数
at平均查询时间
t即为返回前面多少条的数据
g后边搭配一个正则匹配模式,大小写不敏感的

常用举例:

得到返回记录集最多的10个SQL:

mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log
得到访问次数最多的10个SQL:

mysqldumpslow -s c -t 10 /var/lib/mysql/atguigu-slow.log
得到按照时间排序的前10条里面含有左连接的查询语句:

mysqldumpslow -s t -t 10 -g “left join” /var/lib/mysql/atguigu-slow.log
另外建议在使用这些命令时结合│和more 使用,否则有可能出现爆屏情况:

mysqldumpslow -s r-t 10 /ar/lib/mysql/atguigu-slow.log | more

Show Profile进行SQL分析(重中之重)

Show Profile是mysql提供可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优的测量

使用步骤:

1、查看当前mysql是否支持:**show variables like 'profiling;**或者 show variables like ‘profiling %’;

2、开启这个功能(因为默认是关闭的,所以需要手动开启):set profiling=on;

3、运行SQL

4、查看结果:show profiles;

5、诊断SQL,show profile cpu,block io for query ID号;(ID号为第4步Query_ID列中数字)

参数信息说明:

ALL显示所有的开销信息。
BLOCK IO显示块lO相关开销。
**CONTEXT SWITCHES **上下文切换相关开销。
CPU显示CPU相关开销信息。
IPC显示发送和接收相关开销信息。
MEMORY显示内存相关开销信息。
PAGE FAULTS显示页面错误相关开销信息。
SOURCE显示和Source_function,Source_file,Source_line相关的开销信息。
SWAPS显示交换次数相关开销的信息。

Status列显示结果表示严重问题的有

  • converting HEAP to MyISAM查询结果太大,内存都不够用了往磁盘上搬了。
  • Creating tmp table创建临时表,拷贝数据到临时表,用完再删除
  • Copying to tmp table on disk把内存中临时表复制到磁盘,危险!
  • locked锁了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/79070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文心一言插件开发全流程,ERNIE-Bot-SDK可以调用文心一言的能力

文心一言插件开发 前言插件插件是什么工作原理申请开发权限 开始第一步:安装python第二步:搭建项目manifest 描述文件:ai-plugin.json插件服务描述文件:openapi.yaml开发自己的plugin-server 第三步:上传插件 SDK相关链…

Vue3高频面试题+八股文

Vue3.0中的Composition Api 开始之前 Compos:1 tion API可以说是ue3的最大特点,那么为什么要推出Compos1t1on Api,解决了什么问趣? 通常使用Vue2开发的项目,普遍会存在以下问题: 代码的可读性随着组件变大而变差每一种代码复用的…

想要精通算法和SQL的成长之路 - 课程表II

想要精通算法和SQL的成长之路 - 课程表 前言一. 课程表II (拓扑排序)1.1 拓扑排序1.2 题解 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 课程表II (拓扑排序) 原题链接 1.1 拓扑排序 核心知识: 拓扑排序是专…

C++模版基础

代码地址 gitgithub.com:CHENLitterWhite/CPPWheel.git 专栏介绍 本专栏会持续更新关于STL中的一些概念,会先带大家补充一些基本的概念,再慢慢去阅读STL源码中的需要用到的一些思想,有了一些基础之后,再手写一些STL代码。 (如果你…

mysql远程连接失败

先上结论,只提出最容易忽略的地方 服务器是阿里云、腾讯云等平台,平台本身自带的防火墙没有开启iptables规则中禁用了3306,即使你根本没有启用iptables服务 第二条是最离谱的 从这里可以看到,我服务器并未启用 iptables 服务 但…

React 入门实例教程

目录 一、HTML 模板 二、ReactDOM.render() 三、JSX 语法 四、组件 五、this.props.children 六、PropTypes 七、获取真实的DOM节点 八、this.state 九、表单 十、组件的生命周期 constructor() componentWillMount() render() componentDidMount() 组件生命周期…

OPCAE扫盲

目录 1 基本概念 1.1 服务器/客户端 1.2 区域 1.3 报警/条件 1.4 事件 2 条件概念 2.1 子条件 2.2 OPCConditions属性 2.3 Condition质量 2.4 OPCSubConditions属性 2.5 Condition定义 2.6 严重性 2.7 Condition启用/禁用 2.8 Area启用/禁用 2.9 Condition状态集…

Apollo源码安装的问题及解决方法

问题一 在进行git clone时,会报错Failed to connect to github.com port 443: Timed out,经过实践后推荐以下两种方法。 方法一:在原地址前加https://ghproxy.com 原地址:git clone https://github.com/ApolloAuto/apollo.git …

Python while循环嵌套

视频版教程 Python3零基础7天入门实战视频教程 我们在while循环内部还可以继续通过while循环来实现复杂得应用&#xff0c;比如我们打印二维的行列。 实例&#xff1a; # 定义行 i 1# 打印5行 while i < 5:print(f"打印第{i}行")# 定义列j 1# 打印8列while j…

yolov7简化网络yaml配置文件

yolov7代码结构简单&#xff0c;效果还好&#xff0c;但是动辄超过70几个模块的配置文件对于想要对网络进行魔改的朋友还是不怎么友好的&#xff0c;使用最小的tiny也有77个模块 代码的整体结构简单&#xff0c;直接将ELAN结构化写成一个类就能像yolov5一样仅仅只有20几个模块&…

github要求提供双重认证 (2FA), 终于试成功

这是悲剧的事情。 短信认证 不支持中国大陆&#xff0c;包括中国的香港&#xff0c;澳门也不支持。但是中国的台湾他却支持…它默认推荐的几个&#xff0c;什么1password&#xff0c;微软自带&#xff0c;还有一个axxx什么的&#xff0c;只支持google play和ios&#xff0c;我…

2023Web前端面试题及答案(一)

答案仅供参考&#xff0c;每人的理解不一样。 文章目录 1、简单说一说事件流原理 事件流: &#xff08;1&#xff09;事件流是指页面 接收事件的顺序; &#xff08;2&#xff09;假设页面中的元素都具备相同的事件,并且这些个元素之间是相互嵌套的 关系. &#xff08;3&#xf…

CentOS 安装 Docker

注意&#xff1a;下文的命令使用的是 root 用户登录执行&#xff0c;不是 root 的话所有命令前面要加 sudo。 在安装 docker 之前&#xff0c;先说一下配置&#xff0c;我这里是 Centos7 Linux 内核&#xff1a;官方建议 3.10 以上&#xff0c;3.8 以上貌似也可以。 本文目录 1…

廉价的全闪存雷电 NAS 折腾笔记:NUC9 操作系统踩坑

上一篇文章中&#xff0c;分享了关于低成本全闪存 NAS 的个人方案选择。 本篇文章&#xff0c;来聊聊硬件相关部分&#xff0c;以及软件的基础配置部分&#xff0c;也聊聊雷电组网的踩坑之旅。 写在前面 我使用的设备是 NUC9i5QNX&#xff0c;这台设备的硬件基础规格&#x…

类和对象(3)

文章目录 1.回顾上节2. 拷贝构造3. 运算符重载&#xff08;非常重要&#xff09;4. 赋值运算符重载 1.回顾上节 默认成员函数&#xff1a;我们不写&#xff0c;编译器自动生成。我们不写&#xff0c;编译器不会自动生成 默认生成构造和析构&#xff1a; 对于内置类型不做处理对…

【面试心得】WebBench 整理

在面试九识的时候&#xff0c;被问到了WebBench的原理&#xff0c;当时没答上来&#xff0c;这里做一个整理 WebBench 源码【带注释】&#xff1a;GitHub - YukunJ/annotated-webbench-1.5: bilingually annotated Webbench-1.5 webbench是一个轻量的压测工具&#xff0c;可以…

抖去推爆款视频生成器怎么制作开发?--短视频矩阵系统研发

在当今的数字时代&#xff0c;短视频已经成为一种非常受欢迎的内容形式。人们通过观看短视频来获取娱乐、学习和营销信息。然而&#xff0c;制作优秀的爆款视频并不容易&#xff0c;这需要创意、技能和时间。为了简化这一过程&#xff0c;抖去推推出了一款爆款视频生成器&#…

【持续记录】深度学习环境配置

1080面对Transformer连勉强也算不上了&#xff0c;还是要去用小组公用的卡 完整记一个环境配置&#xff0c;方便后面自用✍️ nvidia-smi查看GPU信息 ** CUDA版本12.2 conda -V查询conda版本 22.9.0 新建conda环境 准备装python3.8 conda create --name caiman python3.8.2激…

【Prometheus】Prometheus+Grafana部署

Prometheus 概述 官网https://prometheus.io/docs/introduction/overview/ Prometheus 是一款基于时序数据库的开源监控告警系统&#xff0c;非常适合Kubernetes集群的监控。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态&#xff0c;任意组件只要提供对应的…

从零开始的PICO教程(1)Pico游戏开发项目配置

从零开始的PICO教程&#xff08;1&#xff09;Pico游戏开发项目配置 文章目录 从零开始的PICO教程&#xff08;1&#xff09;Pico游戏开发项目配置一、前言1、大纲 二、成为Pico开发者1、注册 PICO 开发者帐号2、创建组织3、创建应用 三、导入PICO的SDK1、PICO设备开启 “开发者…