数据库调优-数据库优化

数据库优化

如何发现复杂的SQL有问题? 一个个去explain吗?你有没有这样的困惑,开发代码运行顺畅丝滑,上生产了却卡的一逼?

哈哈,相信大家都会遇到这样的问题!

image.png

 

sql

复制代码

# 举个栗子:查询 20 秒 explain select tk.id,ts.* from t_goods ts LEFT JOIN t_sku tk ON tk.id=ts.id where ts.id>100 order by ts.price;

2.1 慢查询日志

数据库查询快慢是影响项目性能的一大因素,对于数据库,我们除了要优化 SQL,更重要的是得先找到需要优化的SQL。

MySQL数据库“ 慢查询日志 ”功能,用来记录查询时间超过某个设定值的SQL语句,这将极大程度帮助我们快速定位到症结所在,以便对症下药。

嗯嗯,好像很有道理喔!!!

image.png

至于查询时间的多少才算慢,每个项目、业务都有不同的要求。MySQL的慢查询日志功能默认是关闭的,需要手动开启。

查看是否开启慢查询功能

 

sql

复制代码

# 查看是否开启慢查询日志 show variables like '%slow_query%'; show variables like 'long_query_time%';

  • 【slow_query_log】 :是否开启慢查询日志, 1 为开启, 0 为关闭。
  • 【log-slow-queries】 :旧版(5.6以下版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
  • 【slow-query-log-file】:新版(5.6及以上版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
  • 【long_query_time】 :慢查询阈值,当查询时间多于设定的阈值时,记录日志,【单位为秒】。

开启慢查询功能

注意:打开慢查询日志可能会对系统性能有一点点影响,如果你的MySQL是主-从结构,可以考虑打开其中一台从服务器的慢查询日志,这样既可以监控慢查询,对系统性能影响又小。

哈哈,这个大多数人都不会考虑到,还不拿个小本本记下来?

image.png

 

ini

复制代码

# 开启慢查询日志 set global slow_query_log=on; ​ # 大于 1 秒钟的数据记录到慢日志中,如果设置为默认 0 ,则会有大量的信息存储在磁盘中,磁盘很容易满掉 set global long_query_time=1; ​ # 记录没有索引的查询。 set global log_queries_not_using_indexes=on;

慢查询日志

 

ini

复制代码

# Time: 2022-07-29T23:59:41.539068Z # User@Host: root[root] @ [192.168.4.1] Id: 10 # Query_time: 2.000222 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0 SET timestamp=1621900781; SELECT SLEEP(2);

日志解析:

  • 第一行,SQL查询执行的具体时间
  • 第二行,执行SQL查询的连接信息,用户和连接IP
  • 第三行,记录了一些我们比较有用的信息,如下解析
 

scss

复制代码

Query_time,这条SQL执行的时间,越长则越慢 Lock_time,在MySQL服务器阶段(不是在存储引擎阶段)等待表锁时间 Rows_sent,查询返回的行数 Rows_examined,查询检查的行数,越长就当然越费时间

  • 第四行,设置时间戳,没有实际意义,只是和第一行对应执行时间。
  • 第五行及后面所有行(第二个# Time:之前),执行的sql语句记录信息,因为sql可能会很长。

2.2 连接数max_connections

同时连接客户端的最大数量,默认值 151 ,最小值1.

连接数导致问题:ERROR 1040,TooManyConnections原因如下

  • 第一:访问确实太高,MySQL有点扛不住了,考虑扩容
  • 第二:MySQL的max_connection配置少了
 

csharp

复制代码

# 查看 max_connections show global variables like 'max_connections' # 设置 max_connections(立即生效重启后失效) set global max_connections=800;

 

sql

复制代码

# 这台MySQL服务器最大连接数是 256 ,然后查询一下服务器使用过的最大连接数: show global status like 'Max_used_connections';

 

erlang

复制代码

# MySQL服务器过去的最大连接数是 245 ,没有达到服务器连接数上限 256 ,应该没有出现 1040 错误, 比较理想的设置是:Max_used_connections / max_connections * 100% ≈ 85% 最大连接数占上限连接数的85%左右,如果发现比例在10%以下,MySQL服务器连接数上限设置的过高了。

这里:最大使用过连接数/最大连接数 ,这个比值保持在85%,就比较理想。

干货喔!!!

image.png

2.3 线程使用情况

如果我们在MySQL服务器配置文件中设置了thread_cache_size,当客户端断开之后,服务器处理此客户的线程将会缓存起来以响应下一个客户而不是销毁(前提是缓存数未达上限)。

根据测试发现,以上服务器线程缓存thread_cache_size没有进行设置,或者设置过小,MySQL服务器一直在创建线程销毁线程。增加这个值可以改善系统性能。通过比较 Connections 和 Threads_created状态的变量,可以看到这个变量的作用。

Threads_created表示创建过的线程数,如果发现Threads_created值过大的话,表明MySQL服务器一直在创建线程,这也是比较耗资源,可以适当增加配置文件中thread_cache_size值,查询服务器thread_cache_size配置:

 

sql

复制代码

# 查询线程使用情况 show global status like 'Thread%'; # 查询线程缓存 show variables like 'thread_cache_size'; # 增加thread_cache_size的值 set global thread_cache_size = 64;

根据物理内存建议设置规则如下:

  • 1G ---> 8
  • 2G ---> 16
  • 3G ---> 32
  • 大于3G ---> 64

又是一大干货喔!!!

image.png

2.4 数据库优化-结构优化

一个好的数据库设计方案对于数据库的性能往往会起到事半功倍的效果。这句话是什么意思呢?

就是说我们的数据库优化不仅仅要局限于查询优化,要从这块跳出来做好最开始的设计优化,如果你这个主要设计是不合理的这些个查询优化效果也只是杯水车薪。

需要考虑数据冗余、查询和更新的速度、字段的数据类型是否合理等多方面的内容。

2.6.1. 将字段很多的表分解成多个表(分表)

对于字段较多的表,如果有些字段的使用频率很低,可以将这些字段分离出来形成新表。

因为当一个表的数据量很大时,会由于使用频率低的字段的存在而变慢。

项目实战的时候会将一个完全信息的表里面的数据拆分出来 形成多个新表 每个新表负责那一块的数据查询 然后这个拆分是定时的

2.6.2. 增加中间表

对于需要经常联合查询的表,可以建立中间表以提高查询效率。通过建立中间表,将需要通过联合查询的数据插入到中间表中,然后将原来的联合查询改为对中间表的查询。

通常都是在统计当中有使用啊,每次统计报表的时候都是离线统计啊,后台有有一个线程对你这统计结果查询号放入一个中间表,然后你对这个中间表查询就行了。

2.6.3. 增加冗余字段

设计数据表时应尽量遵循范式理论的规约,尽可能的减少冗余字段,让数据库设计看起来精致、优雅。

但是,合理的加入冗余字段可以提高查询速度。

表的规范化程度越高,表和表之间的关系越多,需要连接查询的情况也就越多,性能也就越差。

注意:

冗余字段的值在一个表中修改了,就要想办法在其他表中更新,否则就会导致数据不一致的问题。

2.7 MySQL其他的配置参数【my.conf/my.ini文件】

通过优化MySQL的参数可以提高资源利用率,从而达到提高MySQL服务器性能的目的。

MySQL的配置参数都在my.conf或者my.ini文件的[mysqld]组中,常用的参数如下:

 

ini

复制代码

# 01-缓冲区,将数据保存在内存中,保证从内存读取数据。建议innodb_buffer_pool_size设置为总内存大小的3/4或者4/5. innodb_buffer_pool_size= ​ # 02-降低磁盘写入次数。推荐 innodb_log_file_size 设置为 0.25 * innodb_buffer_pool_size innodb_log_file_size= ​ # 03-表示缓冲池字节大小。推荐值为物理内存的50%~80%。 innodb_buffer_pool_size= ​ # 04-用来控制redo log刷新到磁盘的策略。 innodb_flush_log_at_trx_commit=1 ​ # 05-每提交 1 次事务同步写到磁盘中,可以设置为n。 sync_binlog=1 ​ # 06-脏页占innodb_buffer_pool_size的比例时,触发刷脏页到磁盘。 推荐值为25%~50%。 innodb_max_dirty_pages_pct=30 ​ # 07-后台进程最大IO性能指标。默认 200 ,如果SSD,调整为5000~20000 innodb_io_capacity=200 ​ # 08-指定innodb共享表空间文件的大小。 innodb_data_file_path ​ # 09-慢查询日志的阈值设置,单位秒。 long_qurey_time=0.3 ​ # 10-mysql复制的形式,row为MySQL8.0的默认形式。 binlog_format=row ​ # 11-调高该参数则应降低interactive_timeout、wait_timeout的值。 max_connections=200 ​ # 12-过大,实例恢复时间长;过小,造成日志切换频繁。 innodb_log_file_size ​ # 13-全量日志建议关闭。默认关闭。 general_log=0

以上参数,在优化的路上,用的比较多,拿个小本本记下吧!!!

2.8 数据库服务器优化

优化服务器硬件,服务器的硬件性能直接决定着MySQL数据库的性能,硬件的性能瓶颈,直接决定MySQL数据库的运行速度和效率。

需要从以下几个方面考虑:

  • 配置较大的内存。足够大的内存,是提高MySQL数据库性能的方法之一

    • 内存的IO比硬盘快的多,可以增加系统的缓冲区容量,使数据在内存停留的时间更长,以减少磁盘的IO。
  • 配置高速磁盘,比如SSD

这都是比较常见的硬件优化,但是实际过程中,往往,都满足不了我们的需要。

毕竟公司资源有限,又不是大公司,财大气粗。

我们要做的,基本上都是在有限的资源,干最大的事。

作者:llsydn
链接:https://juejin.cn/post/7126106586786824223
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

软件测试面试小程序
被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux 6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 10、开放性测试题,11、安全测试,12、计算机基础

​编辑资料获取方式 :xiaobei_upup,添加时备注“csdn alex”

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

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

相关文章

4. 从感知机到神经网络

目录 1. 从感知机到神经网络 2. 最简单的神经网络 3. 激活函数的引入 1. 从感知机到神经网络 之前章节我们了解了感知机,感知机可以处理与门、非与门、或门、异或门等逻辑运算;不过在感知机中设定权重的工作是由人工来做的,而设定合适的&a…

【将Maven源改为国内阿里云镜像源】

目录 一、如何配置Maven镜像源? 二、Idea中的Maven配置 ​三、项目与你本地仓库和中央仓库的联系 一、如何配置Maven镜像源? 1、打开你的Maven用户设置文件(settings.xml)。默认情况下,该文件存在于你的用户目录下的.m2文件夹中。如果你没…

Kafka 执行命令超时异常: Timed out waiting for a node assignment

Kafka 执行命令超时异常: Timed out waiting for a node assignment 问题描述: 搭建了一个kafka集群环境,在使用命令行查看已有topic时,报错如下: [rootlocalhost bin]# kafka-topics.sh --list --bootstrap-server…

《机器学习by周志华》学习笔记-决策树-01

本书中的「决策树」有时指学习方法,有时指学得的树。 1、基本流程 1.1、概念 基本流程,亦称「判定树」 决策树(decision tree),是一种常见的机器学习方法。以二分类任务为例,我们希望从给定训练数据集学得一个模型,用以对新样例进行分离。 以二分类任务为例,可看作对…

一图看懂 | 蓝卓煤炭行业解决方案

煤炭是我国能源保障的“压舱石,也是国民经济中重要的支柱产业之一无论是发电、建材、造纸、冶金、化工等工业领域都离不开煤炭近年来,在“双碳”及能源安全双重背景下推动智能化技术与煤炭产业的融合发展提升煤矿安全生产能力的重要性与日俱增智慧矿山的建设已逐渐成…

CentOS 7安装配置docker

CentOS 7、8安装、配置docker 这里宿主机的型号选择是centos7.9.2009的版本 1.宿主机关闭防火墙和selinux,配置ipv4 #设置SELinuxdisabled vim /etc/selinux/config SELinuxdisabled 查看防火墙状态:firewall-cmd --state 关闭防火墙:syst…

selenium爬取TapTap评论

上一篇写的beautifulsoup和request爬取出的结果有误。首先,TapTap网页以JS格式解析,且评论并没有“下一页”,而是每次加载到底部就要进行等待重新加载。我们需要做的,是模仿浏览器的行为,所以这里我们用Selenium的方式…

2024年数维杯B题完整代码和思路论文讲解与分析

2024数维杯数学建模完整代码和成品论文已更新,获取↓↓↓↓↓ https://www.yuque.com/u42168770/qv6z0d/bgic2nbxs2h41pvt?singleDoc# 2024数维杯数学建模B题45页论文和代码已完成,代码为全部问题的代码 论文包括摘要、问题重述、问题分析、模型假设、…

【项目实战】使用Github pages、Hexo如何10分钟内快速生成个人博客网站

文章目录 一.准备工作1.安装git2.安装node安装 cnpm 3.使用 GitHub 创建仓库,并配置 GitHub Pages0.Github Pages是什么1. 在 GitHub 上创建一个新仓库2. 创建您的静态网站3. 启用 GitHub Pages4. 等待构建完成5. 访问您的网站 二. Hexo1.什么是Hexo2.安装Hexo1. 安…

Maven 插件使用

1.spring-boot-maven-plugin 我们直接使用 maven package (maven自带的package打包功能),打包Jar包的时候,不会将该项目所依赖的Jar包一起打进去,在使用java -jar命令启动项目时会报错,项目无法正常启动。…

开源相机管理库Aravis例程学习(七)——chunk-parser

开源相机管理库Aravis例程学习(七)——chunk-parser 简介例程代码函数说明arv_camera_create_chunk_parserarv_camera_set_chunksarv_chunk_parser_get_integer_value 简介 本文针对官方例程中的:05-chunk-parser做简单的讲解。并介绍其中调…

kali linux更新卡在libc6:amd64 (2.37-15)

适配于linux的windows子系统,wsl2,安装kali linux,运行 sudo apt update 卡在:Setting up libc6:amd64 (2.37-15) … 关机重启、重新修复执行也不行 解决办法:kill当前apt进程或者关机重启kali-linux,然…

【系统架构师】-选择题(十二)计算机网络

1、网闸的作用:实现内网与互联网通信,但内网与互联网不是直连的 2、管理距离是指一种路由协议的路由可信度。15表示该路由信息比较可靠 管理距离越小,它的优先级就越高,也就是可信度越高。 0是最可信赖的,而255则意味…

【JavaScript】内置对象 - 数组对象 ① ( 数组简介 | 数组创建 | 数组类型检测 )

文章目录 一、数组对象1、数组简介2、数组创建3、数组检测 - Array.isArray() 方法4、数组检测 - instanceof 运算符 Array 数组对象参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array 一、数组对象 1、数组简介 在 JavaScr…

(三十八)第 6 章 树和二叉树(二叉树的二叉线索存储)

1. 背景说明 2. 示例代码 1) errorRecord.h // 记录错误宏定义头文件#ifndef ERROR_RECORD_H #define ERROR_RECORD_H#include <stdio.h> #include <string.h> #include <stdint.h>// 从文件路径中提取文件名 #define FILE_NAME(X) strrchr(X, \\) ? strrc…

Html生成自定义函数的图形(2024/5/10)

大概效果如下&#xff1a; 可以自定义函数和x的定义域。 我们可以使用数学表达式解析库来解析用户输入的函数方程&#xff0c;并根据给定的 x 区间计算函数的值&#xff0c;然后使用图表库绘制图形。 在这里&#xff0c;我将使用 math.js 库来解析数学表达式&#xff0c;并使…

探索计算之美:HTML CSS 计算器案例

本次案例是通过HTML和CSS&#xff0c;我们可以为计算器赋予独特的外观和功能&#xff1b; 在这个计算器中&#xff0c;你将会发现&#xff1a; 简洁清晰的界面设计&#xff0c;使用户能够轻松输入和查看计算结果。利用HTML构建的结构&#xff0c;确保页面具有良好的可访问性和…

【全开源】JAVA上门家政服务系统源码微信小程序+微信公众号+APP+H5

功能介绍 用户端&#xff1a;精准分类、支持家政、维修、万能服务、一口价、报价、线上、各类家政服务、优惠专区、师傅入驻、商家入驻、我的需求、补费明细、我的投诉 师傅端&#xff1a;接单池、消息通知、接单管理、今日订单、师傅入驻、我的钱包、实名认证 商家端&#…

HTTPS 原理和 TLS 握手机制

HTTPS的概述与重要性 在当今数字化时代&#xff0c;网络安全问题日益凸显&#xff0c;数据在传输过程中的安全性备受关注。HTTPS 作为一种重要的网络通信协议&#xff0c;为数据的传输提供了强有力的安全保障。它是在 HTTP 的基础上发展而来&#xff0c;通过引入数据加密机制&a…

流量分析(一)

数据库类流量分析 MySQL流量 常规操作&#xff0c;查找flag ctfhub{} 注意要选择字符集 Redis流量 查找ctfhub结果没找到 尝试把其变成十六进制继续进行查找 看到了前半段flag 接着往下看 找到了后半段的flag MongoDB流量 还是一样查找ctfhub 字符串没找到 转成十六进制也没…