首页 > 数据库 >MySQL慢查询解析

MySQL慢查询解析

时间:2023-07-29 18:00:42浏览次数:54  
标签:NULL name MySQL 查询 set sec mysql 解析 id

文档课题:MySQL慢查询解析.
数据库:mysql 5.7.21
1、建测试表
1.1、建表结构.
mysql> use booksDB;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

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;

1.2、建存储过程
--运用存储过程insert 100万条数据.
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=1012079728;
SET ageVal=100;
SET i=1;
WHILE i < 1000000 DO
INSERT 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 $$

1.3、执行存储过程
mysql> delimiter ;
mysql> call proc_batch_insert();
Query OK, 1 row affected (34 min 23.34 sec)

1.4、检查表信息
mysql> desc t_user;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| name        | varchar(255) | YES  |     | NULL    |                |
| age         | tinyint(4)   | YES  |     | NULL    |                |
| create_time | datetime     | YES  |     | NULL    |                |
| update_time | datetime     | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

mysql> select count(*) from t_user;
+----------+
| count(*) |
+----------+
|   999999 |
+----------+
1 row in set (0.15 sec)

2、开启慢查询功能
2.1、开启慢查询
--查慢查询日志是否开启.
mysql> show variables like 'slow_query_log';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| slow_query_log | OFF   |
+----------------+-------+
1 row in set (0.00 sec)

--开启慢查询日志.
mysql> set global slow_query_log=on;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'slow_query_log';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| slow_query_log | ON    |
+----------------+-------+
1 row in set (0.01 sec)

2.2、修改慢查询阀值
--查慢查询阀值.
mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)

--更改阀值.
mysql> set long_query_time=0.1;
Query OK, 0 rows affected (0.00 sec)

2.3、慢查询日志位置
mysql> show variables like 'slow_query_log_file';
+---------------------+----------------------------------------+
| Variable_name       | Value                                  |
+---------------------+----------------------------------------+
| slow_query_log_file | /mysql/data/mysql-leo-percona-slow.log |
+---------------------+----------------------------------------+
1 row in set (0.00 sec)

3、测试慢查询
3.1、查询语句
mysql> select id,name,age from t_user where name='[email protected]';
+----+-------------------+------+
| id | name              | age  |
+----+-------------------+------+
|  1 | [email protected] |   11 |
+----+-------------------+------+
1 row in set (0.21 sec)

3.2、慢查询日志
# Time: 2023-07-29T09:14:08.312852Z
# User@Host: root[root] @ localhost []  Id:     7
# Schema: booksDB  Last_errno: 0  Killed: 0
# Query_time: 0.216009  Lock_time: 0.000221  Rows_sent: 1  Rows_examined: 999999  Rows_affected: 0
# Bytes_sent: 196
SET timestamp=1690622048;
select id,name,age from t_user where name='[email protected]';

说明:慢查询日志显示sql的执行语句以及执行时间,同时还显示查询的行数.

4、慢查询优化
4.1、查执行计划
mysql> explain select id,name,age from t_user where name='[email protected]';
+----+-------------+--------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table  | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra       |
+----+-------------+--------+------------+------+---------------+------+---------+------+--------+----------+-------------+
|  1 | SIMPLE      | t_user | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 996508 |    10.00 | Using where |
+----+-------------+--------+------------+------+---------------+------+---------+------+--------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

说明:此处主要检查type列,ALL表示全文检索,所以该条sql响应缓慢.

4.2、添加索引
mysql> alter table t_user add index ind_name(name);
Query OK, 0 rows affected (2.13 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> explain select id,name,age from t_user where name='[email protected]';
+----+-------------+--------+------------+------+---------------+----------+---------+-------+------+----------+-------+
| id | select_type | table  | partitions | type | possible_keys | key      | key_len | ref   | rows | filtered | Extra |
+----+-------------+--------+------------+------+---------------+----------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | t_user | NULL       | ref  | ind_name      | ind_name | 768     | const |    1 |   100.00 | NULL  |
+----+-------------+--------+------------+------+---------------+----------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

说明:此时执行计划显示已不再走全表扫描.

4.3、查询验证
mysql> select id,name,age from t_user where name='[email protected]';
+----+-------------------+------+
| id | name              | age  |
+----+-------------------+------+
|  1 | [email protected] |   11 |
+----+-------------------+------+
1 row in set (0.00 sec)

说明:如上所示,添加索引后SQL性能得到很大提升.虽然索引能加快查询速度,但也会降低更新表的速度,如INSERT、UPDATE和DELETE,因为更新表时不仅要更新数据,同时需维护索引,而且索引会占用磁盘空间.

参考文档:https://blog.csdn.net/XZB119211/article/details/127651432.

标签:NULL,name,MySQL,查询,set,sec,mysql,解析,id
From: https://blog.51cto.com/u_12991611/6894292

相关文章

  • MYSQL的安全模式:sql_safe_updates介绍
    查看当前mysqlsession会话下的sql_safe_updatesselect@@sql_safe_updates;查看全局的配置参数sql_safe_updatesselect@@global.sql_safe_updates set[global]sql_safe_updates=1; 在update操作中:当where条件中列(column)没有索引可用且无limit限制时会拒绝更新。whe......
  • PythonNote042---pymysql使用
      简单介绍pymysql的一些操作,增改删查增先建表,再写数据至表中除查询操作外,增改删都需要commit操作,具体原理看ref.1importpandasaspdimportpymysqlimporttimeimportwarningswarnings.filterwarnings("ignore")建表con=pymysql.connect(host='localhost',......
  • mysql之find_in_Set函数
    1.语法#查询出在list中包含column2的所有行。此处list可以是字段或常量selectcolumn1fromtable_namewhereFIND_IN_SET(column2,list)2.与in的区别in后面只能跟常量,find_in_set()函数可以使用常量或字段。in是完全匹配,find_in_set()函数是精确匹配,字段值以英文”,”分隔。3.举......
  • v831-c-yolov2例程解析
    没错,自从把ubuntu搞坏之后无奈把之前的例程全删了,因此所有的笔记都没了,又得从新分析一遍main函数先从最简单的main分析此函数主要创建一个屏幕句柄用来显示,然后调用nn_test来开始yolov2的操作,并且传入画布,显示等都在里面操作,最后跳出来后摧毁屏幕nn_test函数此函数很长,一点......
  • MySQL 8.1正式发行!有哪些值得关注的新功能?
    千呼万唤始出来的新版本MySQL8.1及MySQL8.0.34于2023年7月18日正式发行。从此,MySQL将开启创新版和稳定版同时发行的阶段。MySQL8.1是MySQL的首个创新版,该版本主要增加了如下功能: 捕捉EXPLAINFORMAT=JSON输出,为EXPLAINFORMAT=JSON增加INTO选项,可以将JSON格式的输......
  • 给PHP 8和MySQL 8添加到环境变量-ThinkPHP8知识详解
    在PHPenv安装的时候,环境变量默认的PHP版本是7.4的,MySQL的版本是5.7的,要想使用ThinkPHP8来开发,就必须修改环境变量,本文就详细讲解了如果修改PHP和MySQL的环境变量。1、添加网站启动phpenv,网站,添加网站,域名,根目录,端口,PHP版本都设置好,如图:打开的网站,虽然显示的是php8.0的信息,实际上环......
  • MySQL 8.1正式发行!有哪些值得关注的新功能?
    千呼万唤始出来的新版本MySQL8.1及MySQL8.0.34于2023年7月18日正式发行。从此,MySQL将开启创新版和稳定版同时发行的阶段。MySQL8.1是MySQL的首个创新版,该版本主要增加了如下功能: 捕捉EXPLAINFORMAT=JSON输出,为EXPLAINFORMAT=JSON增加INTO选项,可以将JSON格式的输......
  • MySQL 8.1正式发行!有哪些值得关注的新功能?
    千呼万唤始出来的新版本MySQL8.1及MySQL8.0.34于2023年7月18日正式发行。从此,MySQL将开启创新版和稳定版同时发行的阶段。MySQL8.1是MySQL的首个创新版,该版本主要增加了如下功能: 捕捉EXPLAINFORMAT=JSON输出,为EXPLAINFORMAT=JSON增加INTO选项,可以将JSON格式的输......
  • 深入解析TCP三次握手与四次挥手:建立与断开连接的关键过程
    TCP(传输控制协议)是当今互联网最常用的传输协议之一,它为我们提供了可靠、有序、全双工的数据传输。在实现可靠数据传输的同时,TCP还通过三次握手与四次挥手这两个关键过程,确保了建立与断开连接的可靠性。本文将深入探讨TCP三次握手和四次挥手的工作原理和意义。一、TCP三次握手三次握......
  • 用于查找 SQL Server 中死锁的 T-SQL 查询
    用于查找SQLServer中死锁的T-SQL查询 早些时候,我写了一篇关于使用扩展事件来查找SQLServer上发生的死锁的文章。扩展事件对于跟踪服务器上短时间内发生的死锁有很大帮助,尤其是在生产环境中。然而,在开发环境中,我遇到过当多个开发人员尝试对表执行dml语句时出现持续长......