数据库性能定位-慢sql定位、sql优化(docker容器实战)

news2025/2/5 17:54:12

安装好mysql数据之后,创建的时候,要注意选择 字符集编码。如果没有选择好,你的库表存中文的时候,会字符集乱码。选择utf8mb4.

建表的时候,存储引擎

InnoDB、MyISAM

mysql5.7及以后数据库,表的默认存储引擎 InnoDB

从磁盘的读写速度而言,MyISAM的表  速度要快一些

InnoDB存储引擎,存储追求事务的准确性,准确率要比MyISAM要高。

数据库自身有很多配置参数,参数可以改变数据库的性能。

如何获取慢sql?

1、数据库的慢sql的阈值设置一下。 一般设置为1, 1秒钟。

数据库的配置文件中。 /etc/my.cnf 文件中

long_query_time=1

需要重启数据库

2、修改数据库慢sql的开关,开关打开

set global slow_query_log=ON

不能重启数据库

3、进行性能测试。

测试中,如果,接口的平均响应时间(接口的最大响应时间)超过1秒,这个时候,才可能有慢sql。

有慢sql了,就会自动记录到 slow_query_log_file这个参数配置的日志文件中。就从这个日志文件中,去获取sql就可以了。

4、 测试完成之后, 记得 关闭开关。

set global slow_query_log=OFF

SQL优化

  • 在写on语句时,将数据量小的表放左边,小表写左边,大表写右边 
  • where后面的条件尽可能用索引字段,复合索引时,最好按复合索引顺序写where条件 
  • where后面有in语句,in字段的索引,最好放复合索引的后面,因为in的字段索引可能会失效 
  • 模糊查询时,尽量用 常量开头,不要用%开头,用%开头查询索引将失效 
  • 尽量不要使用 or, 否则索引失效 尽量不要使用类型转换(显式、隐式),否则索引失效 
  • 如果主查询数据量大,则使用in;如果子查询数据量大,则使用exists 
  • 查询哪些列,就根据哪些列group by,不然会产生一个临时表 

实战

第一种获取慢sql:传统的方法

设置数据库慢sql查询参数

1、先连接数据库查看慢sql开关是否开启

show variables like "show%";

2、查看慢sql的阈值是否设置

show variables like "long%";

查看数据库容器信息

docker ps

进入容器

docker exec -it centos7_mysql57 /bin/bash

查看数据库配置信息

cd etc
cd mysql
cat mysql.cnf 

从图中我们没有修改任何节点所以不用修改,但是下方有两个地址

进入mysql.conf.d/

cd mysql.conf.d/

查看mysql.cnf 文件内容

cat mysql.cnf 

修改配置文件就在这个里面修改

先将容器中的文件拷贝当前目录进行修改(容器中无法使用vi命令)

 docker cp centos7_mysql57:/etc/mysql/mysql.conf.d/mysqld.cnf $PWD

修改配置文件(需要备份下文件cp )

cp mysqld.cnf mysqld01.cnf
vim mysqld.cnf

在文件末尾加上

long_query_time = 1

再将修改好的胚子文件拷贝会原地址

 docker cp mysqld.cnf centos7_mysql57:/etc/mysql/mysql.conf.d/mysqld.cnf 

再进入容器查看配置文件是否修改成功

cat mysqld.cnf 

退出容器

exit

重启数据库,配置才会生效

docker restart  centos7_mysql57

产看配置修改是否生效

show variables like "long%";

查看日志文件和慢日志开关

show variables like "slow%";

开启慢查询开关(重启数据库后设置失效)

set global slow_query_log = ON;

再查看设置是否生效

show variables like "slow%";

拷贝日志文件到本地查看

 docker cp centos7_mysql57:/var/lib/mysql/e2d0077fb342-slow.log $PWD

查看文件可以看出文件中无任何内容

cat e2d0077fb342-slow.log 

启动项目和性能脚本开始测试

从图中我们可以看出平均时间大于1s了,那么就怀疑有慢sql问题了

再次将数据库日志拷贝出来进行查看

 docker cp centos7_mysql57:/var/lib/mysql/e2d0077fb342-slow.log $PWD
cat e2d0077fb342-slow.log 

从日志中可以看出sql语句基本都一致,再将sql拷贝出来

select account0_.id as id1_0_, account0_.age as age2_0_, account0_.createtime as createti3_0_, account0_.email as email4_0_, account0_.gqid as gqid5_0_, account0_.identity as identity6_0_, account0_.lasttime as lasttime7_0_, account0_.mobile as mobile8_0_, account0_.money as money9_0_, account0_.password as passwor10_0_, account0_.pay_pwd as pay11_0_, account0_.platform as platfor12_0_, account0_.pmoney as pmoney13_0_, account0_.sex as sex14_0_, account0_.token as token15_0_, account0_.username as usernam16_0_ from kyj.cb_account account0_ where account0_.mobile='18797823533';

分析慢sql

将sql单独拿出来执行时,执行时没有并发,执行时间就很短,从表现来看就不是慢sql

SELECT
	account0_.id AS id1_0_,
	account0_.age AS age2_0_,
	account0_.createtime AS createti3_0_,
	account0_.email AS email4_0_,
	account0_.gqid AS gqid5_0_,
	account0_.identity AS identity6_0_,
	account0_.lasttime AS lasttime7_0_,
	account0_.mobile AS mobile8_0_,
	account0_.money AS money9_0_,
	account0_.PASSWORD AS passwor10_0_,
	account0_.pay_pwd AS pay11_0_,
	account0_.platform AS platfor12_0_,
	account0_.pmoney AS pmoney13_0_,
	account0_.sex AS sex14_0_,
	account0_.token AS token15_0_,
	account0_.username AS usernam16_0_ 
FROM
	kyj.cb_account account0_ 
WHERE
	account0_.mobile = '18797823533';

使用explain来进行解析

explain
SELECT
	account0_.id AS id1_0_,
	account0_.age AS age2_0_,
	account0_.createtime AS createti3_0_,
	account0_.email AS email4_0_,
	account0_.gqid AS gqid5_0_,
	account0_.identity AS identity6_0_,
	account0_.lasttime AS lasttime7_0_,
	account0_.mobile AS mobile8_0_,
	account0_.money AS money9_0_,
	account0_.PASSWORD AS passwor10_0_,
	account0_.pay_pwd AS pay11_0_,
	account0_.platform AS platfor12_0_,
	account0_.pmoney AS pmoney13_0_,
	account0_.sex AS sex14_0_,
	account0_.token AS token15_0_,
	account0_.username AS usernam16_0_ 
FROM
	kyj.cb_account account0_ 
WHERE
	account0_.mobile = '18797823533';

id是表示数据库从上往下开始执行

首先看  type值:

        ALL 是 全表扫描,  我们期望这个值为  ref或 eq_ref    配合rows值看。

                为ALL,第1反应,就是 是不是没有用 索引。

                        看key的值。 如果没有,肯定就没有用索引,还可以看 extra这个的值, Using where  使用了where条件来查询,但是where条件不是索引。

                where条件只有  mobile这个字段。 说明这个字段不是索引。

如何优化

建立索引

因为是注册接口,该sql语句需要查询手机号是否在数据库中存在所以可以把手机号mobile设置为唯一索引

或者通过sql添加索引

ALTER TABLE `kyj`.`cb_account` 
ADD INDEX `index_mobile` USING BTREE (`mobile`);

然后再运行刚刚的sql,可以通过key看出我们运用了新的索引,而且时间比以前的还短

再次运行性能脚本,可以明显看出平均响应时间降低,吞吐量增加了。

如果索引字段的顺序和查询的字段的顺序不一致,那么这个索引就没有使用成功

索引如下:

那么查询结果如下,通过key可以明显看出未使用索引

如何解决这种问题呢?

添加一个新的索引,字段的位置需要和查询语句的字段顺序一致。

查询结果引用索引如下:

详细的sql优化见上方sql优化内容

第二种获取慢sql的方法:企业的监控平台,日志分析平台

日志分析平台中,就会记录,每个事件的 时长  通过这个时长的倒序,就能找到,哪些事件时间是最长,找到这个事件用sql

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

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

相关文章

官方招募 | 仓颉语言三方库社区建设全速启航,全球开发者、技术大神只等您!

Cangjie-TPC招募令 仓颉社区的小伙伴们,官方三方库(Cangjie-TPC)招募开始啦! Cangjie-TPC(https://gitcode.com/Cangjie-TPC) 是 Cangjie 社区用于汇集基于仓颉编程语言开发的开源三方库的主干仓&#xf…

JS获取当前浏览器名称

在JavaScript中,获取当前浏览器名称的方法并不是一个标准的功能,因为浏览器厂商并没有提供一个直接的API来获取浏览器的名称。但是,你可以通过分析用户代理字符串(User-Agent)来推断出浏览器的名称。 以下是一个简单的…

ArcGIS如何将投影坐标系转回为地理坐标系

有时候两个数据,一个为投影坐标系,另一个为地理坐标系时,在GIS软件中位置无法叠加到一起,这需要将两个或多个数据的坐标系统一,可以直接将地理坐标系的数据进行投影,或将投影坐标系转为地理坐标系。下面介绍…

视频号AI美女跳舞,轻松月入30000+,蓝海赛道,流量池巨大,起号猛

今天给大家分享的是一个男生比较感兴趣的内容,AI美女视频跳舞项目4.0版本,7天快速起号,实现每月30000的稳定收入. 大家刷抖音的时候,肯定都刷到过美女跳舞的视频,对吧?这种视频,不管在哪个平台…

电商项目DevOps一体化运维实战

主要讲了git和jkins的使用,其中maven的一个插件还挺好用的,主要可以用来查看哪些类没有使用,哪些导入的包是多余的等。这里展示一下用法。至于git和jkins的搭建后续再操作。 maven插件的使用: 编译后就可以在target下面看到这个h…

网络安全之XSS基础

从 XSS Payload 学习浏览器解码 xss payload 1.<a href"%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">1</a> 2.<a href"&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:…

代码随想录:动态规划6-10

62、不同路径 题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径…

基于STM32开发的智能农业环境监控系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化传感器数据采集与处理环境控制与状态指示Wi-Fi通信与远程监控应用场景 农业温室环境管理农田环境监控与自动化管理常见问题及解决方案 常见问题解决方案结论 1. 引言 随着农业技术…

Codigger 视频会议(Meeting):制造业的高效协作引擎

在制造业数字化转型的浪潮中&#xff0c;企业面临着前所未有的机遇与挑战。视频会议作为一种高效的沟通工具&#xff0c;在制造业中发挥着关键作用。 制造业对于视频会议有着多方面的需求与挑战。不同生产基地往往分布在各地&#xff0c;跨地域协作需求十分迫切。在技术交流时&…

stm32—ADC

1. 什么是ADC 生活中我们经常会用到ADC这种器件&#xff0c;比如说&#xff0c;当我们在使用手机进行语音通信时&#xff0c;ADC器件会将我们的声信号转换为电信号 (模拟信号 ---> 数字信号) 模拟信号&#xff1a; 模拟信号是指用连续变化的物理量表示的信息&#xff0c;其信…

【Vue3】编程式路由导航

【Vue3】编程式路由导航 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日…

【Qt】 常用控件QLCDNumber

常用控件QLCDNumber QLCDNumber是一个专门用来显示数字的控件&#xff0c;类似于“老式计算机”的效果。 QLCDNumber的属性 属性说明 intValue QLCDNumber 显⽰的数字值(int). value QLCDNumber 显⽰的数字值(double). 和 intValue 是联动的. 例如给 value 设为 1.5, i…

C语言程序设计-练习篇

山海自有归期&#xff0c;风雨自有相逢。 一 下面代码的结果是什么&#xff1f; int main() { int i 0; for (i 0; i < 10; i) { if (i 5) //此处为赋值&#xff0c;i 5表达式结果为5 printf("%d ", i); //表达式为真&a…

AI 进阶实战 | 走进大模型(LLM)+智能体(Agent)+提示词(Prompt)

前言 人工智能&#xff08;AI&#xff09;不再只是科幻电影中的桥段&#xff0c;而是正以前所未有的速度改变着我们的世界。随着大规模语言模型&#xff08;LLM&#xff09;系列的崛起&#xff0c;结合高度智能的&#xff08;Agent&#xff09;与精心设计的&#xff08;Prompt…

topic交换机

topic交换机 是什么交换机模式 这个模式可以用点分割代表不同的消息类型 例如:有4种消息,其中我想发送china相关的消息,就china.#,指多个单词 我想发送各国的天气,就可以#.weather 优势 比directexchange相比更方便些 案例 创建队列 创建交换机 绑定 绑定关系已确认

macOS安装搭建python环境

安装Homebrew apt-get是一个常见于Debian和Ubuntu等基于Linux的操作系统中的包管理工具&#xff0c;用于安装、更新和移除软件包。然而&#xff0c;macOS使用的是Homebrew或者MacPorts等其他的包管理工具&#xff0c;并不使用apt-get。 如果你想在macOS上使用类似apt-get的功…

创建、使用、删除 数据库

一、创建数据库 1.1 使用DDL语句创建数据库 CREATE DATABASE 数据库名 DEFAULT CHARACTER SET 字符编码; 案例&#xff1a; 创建一个test 的数据库&#xff0c;并查看该数据库。 create database test default character set utf8; show databases; 1.2 使用Navicat创建数据库 …

快速排序的深入优化探讨

快排性能的关键点分析 决定快排性能的关键点是每次单趟排序后&#xff0c;key对数组的分割&#xff0c;如果每次选key基本⼆分居中&#xff0c;那么快排的递归树就是颗均匀的满⼆叉树&#xff0c;性能最佳。但是实践中虽然不可能每次都是⼆分居中&#xff0c;但是性能也还是可…

【电子信息工程大学生的职业准备策略指南】

电子信息工程是一个快速发展且应用广泛的领域&#xff0c;对于大学生来说&#xff0c;为未来的职业生涯做好准备是一项重要任务。 目录 一、扎实的专业知识基础 二、实践能力的培养 三、编程与软件开发技能 四、创新思维与解决问题的能力 五、专业认证与资格证书 六、实习…

Element UI中el-dialog作为子组件如何由父组件控制显示/隐藏~

1、这里介绍的是将el-dialog作为组件封装便于复用&#xff0c;如何通过父组件控制子组件dialog的显示与隐藏。 2、思路:首先el-dialog是通过dialogVisible的值是否为true或false来控制显示与隐藏的。那么我们可以通过父传子props来将true&#xff08;即showFlag的值&#xff0…