mysq开启慢查询日志,对慢查询进行优化

1.创建实验的环境

创建对应的数据库,然后写脚本向数据库中写入400万条的数据


//创建实验用的数据库
CREATE DATABASE jsschool;//使用当前数据库
USE jsschool;//创建学生表
CREATE TABLE student (sno VARCHAR(20) PRIMARY KEY COMMENT '学生编号',sname VARCHAR(20) NOT NULL COMMENT '学生姓名',ssex VARCHAR(10) NOT NULL COMMENT '学生性别',sbirthday DATETIME COMMENT '学生生日', class VARCHAR(20) COMMENT '学生班级'
)ENGINE=InnoDB DEFAULT CHARSET=utf8;//创建教师表
CREATE TABLE teacher (tno VARCHAR(20) PRIMARY KEY COMMENT '教师编号',tname VARCHAR(20) NOT NULL COMMENT '教师姓名',tsex VARCHAR(10) NOT NULL COMMENT '教师性别',tbirthday DATETIME COMMENT '教师生日',prof VARCHAR(20) NOT NULL COMMENT '教师职称',depart VARCHAR(20) NOT NULL  COMMENT '教师院系'
)ENGINE=InnoDB DEFAULT CHARSET=utf8;//创建课程表
CREATE TABLE course (cno VARCHAR(20) PRIMARY KEY COMMENT '课程编号',cname VARCHAR(20) NOT NULL COMMENT '课程名称',tno VARCHAR(20) NOT NULL COMMENT '外键教师编号',FOREIGN KEY(tno) REFERENCES teacher(tno) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8;//创建分数表
CREATE TABLE score (sno VARCHAR(20) NOT NULL COMMENT '学生编号', cno VARCHAR(20) NOT NULL COMMENT '课程编号', degree DECIMAL COMMENT '成绩',FOREIGN KEY(sno) REFERENCES student(sno),	FOREIGN KEY(cno) REFERENCES course(cno)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

编写脚本向数据库中写入400万条数据,大概花费一晚上左右

import pymysqlif __name__ == '__main__':db = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='123456', db='jsschool')cursor = db.cursor()#sql = "SELECT * FROM `student` WHERE `class`=%s"#values = ("51",)sql = "INSERT INTO `student`(`sno`, `sname`, `ssex`, `sbirthday`, `class`) VALUES (%s, %s, %s,%s,%s)"no_num = 202class_num = 62for i in range(4000000):no_num += 1no = str(no_num)name = "李" + str(i)class_num += 1classvaule = str(class_num)values = (no, name, "男", "1995-06-25", classvaule)cursor.execute(sql, values)db.commit()print(i)db.close()

2.开启慢查询日志,记录执行慢的sql语句

执行语句,查询是否开启了慢查询

show variables like 'slow_query%';

ON 则表示已经开启了

打开配置文件,在你安装的mysql目录下面 MySQL\MySQL Server 8.0

表示是否开启慢查询 1表示开启

slow-query-log=1

存放慢查询的日志的目录

slow_query_log_file="DESKTOP-LQ2HAGP-slow.log"

慢查询的阈值,超过了多少实际需要记录

long_query_time=2

重启mysql服务

使用cmd 命令

net stop mysql
net start mysql

或者直接找到mysql服务,手动点击重启

笔者电脑里服务名是mysql80

输入查询语句进行测试

这里只是为了进行相应的测试,同样的如果你的项目代码和mysql数据库进行交互的时候,存在慢查询的语句,也会被保存下来

打开慢查询日志,查看是否记录

3.对慢查询语句进行优化

3.1使用索引对慢查询进行优化

给student表的class字段增加索引

alter table student add index indx_class (class);

没加索引之前,每次查询需要3s

加索引后,效果明显

3.2索引失效的情况

3.2.1查询的时候使用 or 可能导致索引失效

 select * from student where class = '9896' or sname = '李9836';

sname字段没有加索引,查询sname字段的时候还是会进行全表扫描

3.2.2使用like通配符导致的索引失效

select * from student where class like'%987';

select * from student where class like'987%';

通过对比可以发现,通配符放置到前面,会导致索引失效

3.2.3不满足索引的最左匹配原则

MySQl建立联合索引时,会遵循最左前缀匹配的原则,即最左优先。如果你建立一个(a,b,c)的联合索引,相当于建立了(a)、(a,b)、(a,b,c)三个索引。

如果此时a字段上没有增加索引,则会导致索引失效

建立起class 和 sname 的联合索引

alter table student add index indx_class_name (class,sname);

联合查询

select * from student where class = '9896' and sname = '李9833';
能看到索引是生效了

select * from student where sname = '李999841';
单独查询使用过滤条件,sname能看到索引已经失效了,

3.2.4索引字段上使用了 != 或者<> 的符号

select * from student where class != '9687'

这种情况下使用索引 和不适用索引,都是一样的慢的,索引要尽量避免使用不等于符号

4.对数据库结构进行优化,来针对慢查询

1.让表的结构尽量满足三大范式

2.如果是因为表的数据过多了可以考虑进行分库,分表

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

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

相关文章

微软为新闻编辑行业推出 AI 辅助项目,记者参加免费课程

2 月 6 日消息&#xff0c;微软当地时间 5 日发布新闻稿宣布与多家新闻机构展开多项基于生成式 AI 的合作。微软表示&#xff0c;其使命是确保新闻编辑室在今年和未来拥有创新。 目前建议企业通过微软官方合作伙伴获取服务&#xff0c;可以合规、稳定地提供企业用户使用ChatGP…

C#委托的前世今生

起因 很多C#初学者&#xff0c;都遇到过这样的问题——线程间操作无效&#xff0c;从不是创建控件的线程访问它。 今天就这个问题&#xff0c;展开分析。 溯源 先说下这个问题产生的根源。 大家都知道&#xff0c;程序运行起来之后&#xff0c;首先会有一个主线程&#xff…

用HTML5 + JavaScript实现下雪效果

用HTML5 JavaScript实现下雪效果 <canvas>是一个可以使用脚本 (通常为JavaScript) 来绘制图形的 HTML 元素。 <canvas> 标签/元素只是图形容器&#xff0c;必须使用脚本来绘制图形。 HTML5 canvas 图形标签基础https://blog.csdn.net/cnds123/article/details/…

搜索与图论(一)(深搜,广搜,树与图的存储遍历,拓扑排序)

一、DFS 往深里搜&#xff0c;搜到叶子结点那里&#xff0c;回溯&#xff0c;到可以继续到叶子结点深搜的位置。 1、回溯一定要恢复现场 2、定义一个与当前递归层数有关的终止条件&#xff08;题目要求的东西&#xff09; 3、每层都用循环判断是否存在可以dfs的路 输出数字…

DDoS攻击激增,分享高效可靠的DDoS防御方案

当下DDoS攻击规模不断突破上限&#xff0c;形成了 "网络威胁格局中令人不安的趋势"。专业数据显示&#xff0c;对比2022年上半年与2023年上半年&#xff0c;所有行业的DDoS攻击频率增加了314%。其中零售、电信和媒体公司遭受的攻击规模最大&#xff0c;三个垂直行业的…

10.0 Zookeeper 权限控制 ACL

zookeeper 的 ACL&#xff08;Access Control List&#xff0c;访问控制表&#xff09;权限在生产环境是特别重要的&#xff0c;所以本章节特别介绍一下。 ACL 权限可以针对节点设置相关读写等权限&#xff0c;保障数据安全性。 permissions 可以指定不同的权限范围及角色。 …

如何启动若依框架

Mysql安装 一、下载 链接&#xff1a;https://pan.baidu.com/s/1s8-Y1ooaRtwP9KnmP3rxlQ?pwd1234 提取码&#xff1a;1234 二、安装(解压) 下载完成后我们得到的是一个压缩包&#xff0c;将其解压&#xff0c;我们就可以得到MySQL 5.7.24的软件本体了(就是一个文件夹)&…

【Web - 框架 - Vue】随笔 - 通过`CDN`的方式使用`VUE 2.0`和`Element UI`

通过CDN的方式使用VUE 2.0和Element UI VUE 网址 https://cdn.bootcdn.net/ajax/libs/vue/2.7.16/vue.js源码 https://download.csdn.net/download/HIGK_365/88815507测试 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…

JavaWeb后端开发(第一期):Maven基础、Maven的安装配置、如何创建maven项目模块、maven的生命周期

Java后端开发&#xff1a;2024年2月6日 -> LiuJinTao 文章目录 JavaWeb后端开发&#xff08;第一期&#xff09; &#xff1a; maven基础一、 maven介绍1.1 什么maven呢&#xff1a;1.2 maven的作用1.3 maven 模型1.4 maven 仓库 二、maven 安装2.1 配置本地仓库2.2 配置阿里…

第二十五回 偷骨殖何九叔送丧 供人头武二郎设祭-Numpy数组计算

何九叔晕倒了&#xff0c;被抬回家里&#xff0c;他对老婆说&#xff0c;我没事&#xff0c;是看到武大郎的情况&#xff0c;明显是中毒身亡&#xff0c;但是又不敢声张&#xff0c;怕西门庆打击报复。九叔的老婆让他送丧的时候拿两块骨头&#xff0c;同前面十两银子一起收着&a…

mybatis sql报错记录: Encountered “<EOF>“ at line 1, column 0.

报错日志&#xff1a; 解决问题&#xff1a; ***<if test" ">***AND T1.xxx_code in<foreach item"pollCode" collection"vo.pollCodeList" open"(" separator"," close")">#{pollCode}</foreac…

【C++】win11,OpenCV安装教程(VS2022)

1.下载 首先进入官网&#xff0c;下载对应的安装包&#xff0c;苹果系统就选IOS pack&#xff0c;微软系统就选Windows 下载地址&#xff1a;Releases - OpenCV 不方便外网下载的话可以下载我分享的百度网盘资源&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1lV7l…