Mysql之慢查询的排查及其优化
文章目录
- 一:建造海量数据插入数据库
- 1:建造表
- 2:插入200万条数据
- 二:排查慢查询的sql
- 前言:
- 1:查看数据库服务慢查询日志是否开启
- 2:开启慢查询日志
- 3:查看慢查询阈值(超过这个时间sql就会被记录在慢查询日志中)
- 4:我们更改一下阈值(因为我们的测试数据插叙时间基本上是不会超过10s的)
- 5:查看慢查询日志的位置
- 6:测试慢查询的sql
- (1):测试用例一
- (2):测试用例二
- 7:查询慢SQL的日志
- 小结:
- 三:慢查询优化
- 前言:
- 1:查询sql的执行计划
- 2:加索引
- 3.索引时间进行比较
- 4:小结
一:建造海量数据插入数据库
1:建造表
CREATE TABLE `t_user` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`age` tinyint(4) DEFAULT NULL,`create_time` datetime DEFAULT NULL,`update_time` datetime DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2:插入200万条数据
delimiter $$
DROP PROCEDURE IF EXISTS proc_batch_insert;
CREATE PROCEDURE proc_batch_insert()
BEGIN
DECLARE pre_name BIGINT;
DECLARE ageVal INT;
DECLARE i INT;
SET pre_name=187635267;
SET ageVal=100;
SET i=1;
WHILE i < 1000000 DOINSERT INTO t_user(`name`,age,create_time,update_time) VALUES(CONCAT(pre_name,'@qq.com'),(ageVal+i)%30,NOW(),NOW());
SET pre_name=pre_name+100;
SET i=i+1;
END WHILE;
END $$delimiter ;
call proc_batch_insert();
二:排查慢查询的sql
前言:
我们查询比较慢的sql我们一定要将其记录下来 记录我们执行的sql 这样们在排查的时候才可以记录下来,那么我们可以打开我们的mysql慢查询日志,在这个日志里会记录下我们慢查询的sql 当然这个慢查询日志中的慢查询是有限定时间的,我们可以更改限定时间
1:查看数据库服务慢查询日志是否开启
show variables like 'slow_query_log';
默认 是关闭的 我们选择打开
2:开启慢查询日志
set global slow_query_log=on;
3:查看慢查询阈值(超过这个时间sql就会被记录在慢查询日志中)
这个阈值默认是10s
show variables like 'long_query_time’;
4:我们更改一下阈值(因为我们的测试数据插叙时间基本上是不会超过10s的)
set long_query_time=0.3;
5:查看慢查询日志的位置
主要是方便我们后续进行查找
show variables like 'slow_query_log_file';
6:测试慢查询的sql
(1):测试用例一
select * from t_user;
(2):测试用例二
SELECTid,NAME,age
FROMt_user
where name = '187795367@qq.com';
7:查询慢SQL的日志
注意Mac电脑的话 你是无权限打开 data 文件夹的 也就是无法查看你的mysql日志 所以需要开权限 :sudo chmod -R 777 文件路径
cat MacdeMacBook-Pro-slow.log
这里显示出我们慢查询的两条sql 数据 同时显示出了慢sql的执行语句 以及 慢sql的执行时间(超过我们设置的0.3s的才记录下来)同时还显示出了查询的行数;找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。
小结:
mysql判断sql语句是不是慢查询,是根据语句的执行时间来衡量的,mysql会用语句的执行时间和long_query_time这个系统参数做比较,如果语句执行时间大于long_query_time,都会把这个语句记录到慢查询日志里面。long_query_time的默认值是10s,一般生产环境不会设置这么大的值,一般设置1秒。
三:慢查询优化
前言:
找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。
1:查询sql的执行计划
EXPLAIN SELECTid,NAME,age
FROMt_user
where name = '187795367@qq.com';
为了直观展示查询结果,这里使用navicat执行sql。
主要看type那列,ALL标识全文检索,所以这条sql查询很慢。
解决:最简单有效的方法就是:加索引。
2:加索引
alter table add index nameIndex (name);
可以看出type是ref,已经不是全盘扫描了。
再进行查询
SELECTid,NAME,age
FROMt_user
where name = '187795367@qq.com';
3.索引时间进行比较
- 没加索引之前0.4s
- 加索引之后0.01s
很明显快了几十倍。
4:小结
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。
Mysql之慢查询的排查及其优化相关推荐
- mysql 5.5 查询_mysql5.5数据库优化--定位慢查询
什么是慢查询 mysql记录下查询超过指定时间的语句,被称为"慢查询": 启动慢查询日志 1.查询是否把索引的SQL记录到慢查询日志中 SHOW VARIABLES LIKE 'l ...
- MySQL大in查询技术如何优化?
某日,尼古拉斯赵四 crud 完后,突发奇想: MySQL大in查询技术还能优化吗?还是只能业务优化?. 注意,in里面的数据随用户选择类型成递增. x团:可以试试 in 分批查! 赵四:不行啊,这是 ...
- 我的MYSQL学习心得(十六) 优化
原文:我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看 ...
- mybatis与mysql调优_MySQL + mybatis的SQL优化方案
sql优化方案: 1.添加索引,在条件参数,关联参数上建立参数, 2.字段优化,需要什么字段查什么字段 3.模糊查询尽量使用: select * from tableName a where a.na ...
- Mysql 慢日志查询小于1000ms显示0s问题排查
Mysql 慢日志查询<1000ms显示0s问题排查 在描述问题之前,先温习下Mysql 慢日志的知识. Mysql慢日志是Mysql用来记录统计执行耗时超过long_query_time 指标 ...
- mysql 优化表 3000万_mysql优化:专题三、关于单表查询,可以这么优化
mysql优化:专题三.关于单表查询,可以这么优化 作者:PHPYuan 时间:2018-10-18 03:41:26 上篇讲解了「mysql优化专题」90%程序员都会忽略的增删改优化(2),相信大家 ...
- Mysql 多表联合查询效率分析及优化
1. 多表连接类型 1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用',' 如: [sql] view plaincopy print? S ...
- mysql 多表查询 优化_Mysql 多表联合查询效率分析及优化
1. 多表连接类型 1. 笛卡尔积(交叉连接)在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用',' 如: SELECT * FROM table1 CROSS JOI ...
- 读薄《高性能MySql》(四)查询性能优化
读薄<高性能MySql>(一)MySql基本知识 读薄<高性能MySql>(二)Scheme与数据优化 读薄<高性能MySql>(三)索引优化 读薄<高性能M ...
最新文章
- 参加java培训真的能学到有用的吗
- Android-JNINDK(一)入门
- Java并发编程之ThreadLocal源码分析
- javaScript 验证码代码
- 腾达n304v2支持万能中继吗_驱动天空 - 网络设备 - 宽带路由器 - 腾达路由器
- 单元测试 问题描述_单元测试技巧:创建描述性测试
- python地图散点图_Python中基于Basemap的三维散点图
- C++调用函数模仿数字钟表
- unity 电梯_unity应用实例——电梯模拟系统
- 20191113每日一句
- visio2007安装教程_电脑安装Visio 2007的详细方法
- 成都11区+4县+5市高分辨率边界kml
- 3DMAX场景渲染失败怎么办?
- Google ArCode官网 ARCode支持机型
- msi 微星b350 tomahawk主板 刷bios教程
- 5、创建用户微服模块,使用路由网关(gateway 3.0.3)微服进行访问
- Python 中 Logging 模块使用详情
- 解决前端直接跳转后台,未登录问题
- Long-term 3D Localization and Pose from Semantic Labellings
- 纽约的雪-我的西行漫记
热门文章
- 为什么划分内核态、用户态?
- 循环单链表的销毁操作
- 功率放大器的增益是什么意思
- 微信怎样开发小程序【公司企业小程序开发】
- 【科普】优质变色镜片的选择
- java.lang.ClassNotFoundException:javax.xml.ws.soap.AddressingFeature $ Responses
- 没有编辑器,如何给PDF文件设置密码?
- 《大规模元搜索引擎技(1)》一1.1 Web上查找信息
- 欧姆龙cp1h与台达变频器modbus rtu通讯程序
- 谷歌验证器的原理及JS实现