MySQL5.7慢查询实践

这篇具有很好参考价值的文章主要介绍了MySQL5.7慢查询实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

总结

  1. 获取慢查询SQL
  • 已经执行完的SQL,检查慢查询日志,日志中有执行慢的SQL
  • 正在执行中的SQL,show proccesslist;,结果中有执行慢的SQL

慢查询日志关键参数

名称 解释
Query_time 查询消耗时间
Time 慢查询发生时间
  1. 分析慢查询SQL explain 慢SQL

explain关键参数

名称 解释
key 实际用到的索引列
type 索引类型
extra 额外信息

type部分值

名称 解释
consts 基于主键或唯一索引查询,最多返回一条数据,优化阶段可得到数据
ref 基于普通索引的等值查询,表间等值连接
range 利用索引范围查询
index 全索引扫描
ALL 全表操作
  • 阿里java开发手册-泰山版,要求至少range

Extra部分值

名称 解释
Using index 使用覆盖索引,减少表扫描和回表
Using index condition 先条件过滤索引再查询数据
Using filesort 使用外部排序,非索引排序
Using where 使用where条件
Impossible where where总是false
Using temporary 使用临时表,一般发生在order by无索引列时
Using join buffer (Block Nested Loop) 在进行嵌套循环连接,内表大
Select tables optimized away 该查询不需要访问实际的表,而是通过优化方式直接计算出结果
  1. 优化慢SQL

准备数据库

CREATE DATABASE IF NOT EXISTS test_slow DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;
use test_slow;

CREATE TABLE `person_info_large` (  
    `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,  
    `code` VARCHAR (36),
    `name` VARCHAR (36),
    `title` VARCHAR (72),
	`location` VARCHAR (108),
    PRIMARY KEY `pk_id` (`id`),
    UNIQUE `uk_code` (`code`),
    KEY `idx_title_location`(`title`,`location`) 
) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8

行(java生成sql文件》导入sql文件)

package com.xcrj.gen;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.UUID;

public class Main {
    public static void main(String[] args) {
        generate(300 * 10000);
    }

    private static String rand36Str() {
        long time = System.currentTimeMillis();
        int random = (int) (Math.random() * Integer.MAX_VALUE);
        UUID uuid = new UUID(time, random);//随机种子
        return uuid.toString();
    }

    private static String rand36Str(int num) {
        StringBuilder sb = new StringBuilder();
        UUID uuid;
        for (int i = 0; i < num; i++) {
            uuid = UUID.randomUUID();
            sb.append(uuid.toString());
        }
        return sb.toString();
    }

    private static void generate(int size) {
        String row = "INSERT INTO researcher(`code`,`name`,`title`,`location`) VALUE(%s);";
//        System.out.println(String.format(sql,IdWorker.getId()));
        String path = "./test_slow_researcher.sql";
        File file = new File(path);
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try (
                FileOutputStream fos = new FileOutputStream(path);
                BufferedOutputStream bos = new BufferedOutputStream(fos);
        ) {
            for (int i = 0; i < size; i++) {
                StringBuilder sb = new StringBuilder();
                String code = rand36Str(1);
                String name = rand36Str(1);
                String title = rand36Str(2);
                String location = rand36Str(3);
                sb.append("'").append(code).append("'").append(",")
                        .append("'").append(name).append("'").append(",")
                        .append("'").append(title).append("'").append(",")
                        .append("'").append(location).append("'");

                bos.write(String.format(row, sb.toString()).getBytes());

                if (i < size - 1) {
                    bos.write("\n".getBytes());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

开启慢查询日志

# 检查默认值
show variables like '%quer%';

# 开启慢查询日志
set global slow_query_log=on;
# 设置慢查询阈值为1s
set global long_query_time=1;
# 查看慢查询日志路径
show global variables like 'slow_query_log_file'

# 检查设置值,若发现未生效,关闭当前会话(关闭数据库)重新打开,再检查
show variables like '%quer%';

MySQL5.7慢查询实践,mysql,mysql

参数 含义
slow_query_log 是否开启慢查询日志
slow_query_log_file 慢查询日志路径
long_query_time 慢查询阈值,默认10s

慢查询测试1,已经执行完的慢查询

# 统计
SELECT count(*) FROM researcher;
# 无索引列
SELECT `name` FROM researcher ORDER BY `name` DESC;
# 有索引列
SELECT `code` FROM researcher ORDER BY `code` DESC;
# 查询慢查询日志文件地址 /var/lib/mysql/333a2bf4a87e-slow.log
show variables like '%quer%';
# 查看慢查询日志
more /var/lib/mysql/333a2bf4a87e-slow.log
# 分析SQL
explain SELECT count(*) FROM researcher;
explain SELECT `name` FROM researcher ORDER BY `name` DESC;
explain SELECT `code` FROM researcher ORDER BY `code` DESC;

SELECT count(*) FROM researcher;
MySQL5.7慢查询实践,mysql,mysql

  • Query_time: 大于18s

SELECT nameFROM researcher ORDER BYname DESC;
MySQL5.7慢查询实践,mysql,mysql

  • Query_time: 大于19s

SELECT codeFROM researcher ORDER BYcode DESC;
MySQL5.7慢查询实践,mysql,mysql

  • Query_time: 大于16s

explain SELECT count(*) FROM researcher;
MySQL5.7慢查询实践,mysql,mysql

  • key=uk_code,可知 count(*) 会使用索引
  • type=index
  • extra=Using index

explain SELECT nameFROM researcher ORDER BYname DESC;
MySQL5.7慢查询实践,mysql,mysql

  • key=NULL
  • type=ALL
  • extra=Using filesort

explain SELECT codeFROM researcher ORDER BYcode DESC;
MySQL5.7慢查询实践,mysql,mysql

  • key=uk_code
  • type=index
  • extra=Using index

explain SELECT idFROM researcher ORDER BYid DESC;
MySQL5.7慢查询实践,mysql,mysql

  • key=primary
  • type=index
  • extra=Using index

参数说明

慢查询日志部分参数

名称 解释
Query_time 查询消耗时间
Time 慢查询发生时间

explain部分值

名称 解释
key 实际用到的索引列
type 索引类型
extra 额外信息
select_type 查询方式
possible_keys 可能用到的索引列

type部分值

名称 解释
consts 基于主键或唯一索引查询,最多返回一条数据,优化阶段可得到数据
ref 基于普通索引的等值查询,表间等值连接
range 利用索引范围查询
index 全索引扫描
ALL 全表操作
  • 阿里java开发手册-泰山版,要求至少range

Extra部分值

名称 解释
Using index 使用覆盖索引,减少表扫描和回表
Using index condition 先条件过滤索引再查询数据
Using filesort 使用外部排序,非索引排序
Using where 使用where条件
Impossible where where总是false
Using temporary 使用临时表,一般发生在order by无索引列时
Using join buffer (Block Nested Loop) 在进行嵌套循环连接,内表大
Select tables optimized away 该查询不需要访问实际的表,而是通过优化方式直接计算出结果

select_type部分值

名称 解释
Simple 简单查询
Primary 关联查询或子查询的外层查询
Unoin 关联查询或子查询的后续查询

慢查询测试2,正在执行的慢查询

SELECT `name` FROM researcher ORDER BY `name` DESC;
show processlist;

MySQL5.7慢查询实践,mysql,mysql文章来源地址https://www.toymoban.com/news/detail-696688.html

  • Time=34,已经执行了34s

恢复默认参数

# 检查默认值
show variables like '%quer%';
# 开启慢查询日志
set global slow_query_log=off;
# 设置慢查询阈值为1s
set global long_query_time=10;
# 检查设置值,若发现未生效,关闭当前会话(关闭数据库)重新打开,再检查
show variables like '%quer%';
# 重置表,包括自增ID
TRUNCATE TABLE researcher;

到了这里,关于MySQL5.7慢查询实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 安装指定版本的mysql(mysql5.7)

    安装软件的三种方式: rpm 安装 源代码编译安装 yum仓库安装 本地光盘 阿里云yum源 自建yum仓库文件夹 去mysql官网 寻找该软件下的地址,设置为yum仓库即可(可指定版本) 先检查是否自带了mysql 有的话 mariadb同理 有的话 https://repo.mysql.com/yum/ 找到对应版本 例如5.7 https://repo.m

    2024年02月08日
    浏览(44)
  • 安装指定版本的mysql(安装mysql5

    安装软件的三种方式: rpm 安装 源代码编译安装 yum仓库安装 本地光盘 阿里云yum源 自建yum仓库文件夹 去mysql官网 寻找该软件下的地址,设置为yum仓库即可(可指定版本) 先检查是否自带了mysql 有的话 mariadb同理 有的话 https://repo.mysql.com/yum/ 找到对应版本 例如5.7 https://repo.m

    2024年02月08日
    浏览(72)
  • 【MySQL】CentOS编译安装MySQL5.7实战

    这篇文章是关于MySQL编译安装的,重点掌握的是编译的过程,以及体会排错的痛苦。出错在所难免,最重要的是要有一颗不放弃的心。 本文收录于《数据库入门与精通》专栏, 本专栏写作的过程中,联合了csdn几位DBA大佬,目前正在整理更新目录,力争让大家学到一些真东西,

    2024年02月16日
    浏览(60)
  • MySQL学习笔记之MySQL5.7用户管理

    基本格式: create user \\\'用户名\\\' identified by \\\'密码\\\'; 使用新的用户登录、查看数据库表和自己的权限: 可见默认情况下,普通用户的权限很小。 可以在用户名后面加上 @\\\'主机\\\' 来限制该用户登录的主机,不写为 % ,即不限主机: 查看所有用户的用户名和登录主机,首先切换到

    2024年02月13日
    浏览(46)
  • window 以zip的方式 安装mysql5.7或mysql8,或者两个一起安装Mysql5.7和Mysql8、或其他的版本也可以

    注意不能同一个端口。需要创建个my.ini ,配置内容在网上查下即可 比如说 mysql8的配置文件或mysql5.7的配置,当然内容差别不大,只是需要看自己需求或业务来制定配置内容 以下的命令操作需要以管理员方式打开哦 这里安装多个不同mysql版本是可以的,只要注意配置文件的端口

    2024年02月04日
    浏览(54)
  • MySQL5.7安装

    1.1 下载安装 下载安装包https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-winx64.zip安装到想要安装的目录(路径不要有中文) 1.2 添加环境变量 我的电脑-属性-高级-环境变量,加入%D:softwareMySQLmysql-5.7bin;(注意修改为自己的路径) 1.3 修改配置文件 在mysql-5.7目录下创建my.ini文件 添加

    2024年02月03日
    浏览(33)
  • Docker 安装 MySQL5.7 和 MySQL8

    拉下来镜像后 执行 docker images 此时我们已经有这个镜像了。 在根目录下创建 app , 在 app 目录下创建 mysql57 文件夹。 命令如下: 参数说明 : -d :将容器在后台运行(以分离模式运行)。 -p 3306:3306 :将宿主机的 3306 端口映射到容器的 3306 端口,这样可以通过宿主机的 3306

    2024年02月04日
    浏览(51)
  • MySQL5.7安装教程

    说明:本教程是msi版,安装MySQL8.0的msi版时也可以参考此教程。Zip Archive版是绿色解压版,直接解压配置即可使用。 官网:MySQL :: Download MySQL Community Server 1、打开上面的网址,然后根据自己的需求进行选择,如下图所示: 2、选择版本和系统,然后选择那个三百多MB的进行下载

    2024年01月16日
    浏览(59)
  • MySQL5.5安装图解

    一、 MYSQL 的安装 1、打开下载的mysql安装文件mysql-5.5.27-win32.zip,双击解压缩,运行“setup.exe” 2、选择安装类型,有“Typical(默认)”、“Complete(完全)”、“Custom(用户自定义)”三个选项,选择“Custom”,按“next”键继续 3、点选“Browse”,手动指定安装目录 4、填上安装

    2023年04月16日
    浏览(33)
  • 【必知必会的MySQL知识】mysql5.7安装教程

    下载地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads 下载zip免安装版,可以省去很多事 my.ini文件内容如下 以上配置文件说明 basedir--mysql目录 datadir--数据路径 port --端口 skip-grant-tables --刚开始跳过登陆校验 安装服务: 初始化数据库 登陆命令: 最后,我们当然不希望以后写

    2024年02月02日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包