0202性能分析-索引-MySQL

news2024/9/29 3:21:31

1 索引语法

  • 创建索引

    CREATE [UNIQUE|FULLTEXT] INDEX index_name ON table_name(index_column_name,...);
    
    • Index_name:规范为idx_表名_字段名...
  • 查看索引

    SHOW INDEX FROM table_name;
    
  • 删除索引

    DROP INDEX index_name ON table_name;
    

按照下列要求,创建索引:

  1. name字段为姓名字段,该字段值可能重复,为该字段创建索引;
  2. phone手机号字段值,要求非空且唯一,为该字段创建唯一索引;
  3. 为profession、age、status创建联合索引;
  4. 为email索引建立合适的索引来提升查询效率。

首先查看下表tb_user1当前索引,如下图1-2所示:

在这里插入图片描述

name字段建立常规索引,sql如下:

CREATE INDEX idx_tb_user1_name ON tb_user1(name);

给字段phone创建唯一索引,sql如下:

CREATE UNIQUE INDEX idx_tb_user1_phone  ON tb_user1(phone);

为profession、age、status创建联合索引,sql如下:

CREATE INDEX idx_tb_user1_pro_age_sta ON tb_user1(profession, age, phone);
  • 联合索引字段顺序由讲究
  • seq_in_index:该索引(联合索引)字段顺序

为提高查询效率,为email字段建立常规索引,sql如下:

CREATE INDEX idx_tb_user1_email ON tb_user1(email);

在此查看tb_user1表中的索引如下图1-3所示:

在这里插入图片描述

删除idx_tb_user1_email索引,sql如下:

DROP INDEX idx_tb_user1_email ON tb_user1;

2 性能分析

2.1 查看执行频次

通过如下命令,可以查看当前数据库INSERT,UPDATE,DELETE,SELECT的访问频次

SHOW GLOBAL|SESSION STATUS LIKE 'Com_______'

如下图2.1-1所示:

在这里插入图片描述

  • Com后面跟7个下划线

  • 通过该指令确认当前数据库是查询为主还是增、删或者改为主,然后针对不同类型做相应的优化。

2.2 慢查询日志

MySQL慢查询日志是MySQL数据库的一项功能,用于记录执行时间超过预设阈值的查询语句。慢查询日志可以帮助你识别数据库性能瓶颈和优化查询语句。

要启用MySQL慢查询日志,你可以按照以下步骤进行操作:

  1. 打开MySQL配置文件(通常是my.cnf或my.ini)。你可以在MySQL的安装目录中找到该文件。

  2. 在配置文件中找到[mysqld]部分,如果不存在,请添加该部分。

  3. [mysqld]部分下添加或修改以下行,以启用慢查询日志:

    slow_query_log = 1  // 启用慢查询日志
    slow_query_log_file = /path/to/slow-query.log  // 慢查询日志文件的路径和名称
    long_query_time = 1  // 查询执行时间超过多少秒将被记录到慢查询日志中
    

    注意,你需要根据实际情况设置适当的路径和时间阈值。

  4. 保存并关闭配置文件。

  5. 重启MySQL服务器,以使配置更改生效。

现在,MySQL将开始记录执行时间超过指定阈值的查询语句到慢查询日志文件中。你可以使用任何文本编辑器打开日志文件以查看其中的查询语句和执行时间。

另外,你也可以使用MySQL提供的工具来分析慢查询日志,例如mysqldumpslow和pt-query-digest。这些工具可以帮助你解析慢查询日志文件并生成汇总报告,以便更好地理解数据库性能问题。

需要注意的是,启用慢查询日志会对系统性能产生一定的影响,因为它需要记录大量查询信息。因此,在生产环境中,你可能需要谨慎使用慢查询日志功能,并根据需要进行开关控制。

示例:

Time                 Id Command    Argument
# Time: 2023-06-12T00:28:49.903565Z
# User@Host: root[root] @  [172.17.0.1]  Id:     8
# Query_time: 2.961605  Lock_time: 0.000026 Rows_sent: 1  Rows_examined: 0
use gaogzhen;
SET timestamp=1686529726;
select count(*) from tb_sku;
  • 记录当前时间、登录用户、主机、查询用时、加锁时间、查询那个数据库、时间、执行语句等
  • 慢查询日志一般在开发测试环境中使用,生成环境慎用。

2.3 profile

MySQL的profile是一种功能,用于分析查询的性能和资源消耗情况。通过启用profile,你可以获得关于每个查询的详细信息,包括执行时间、扫描的行数、使用的临时表等等。这对于优化查询和发现潜在的性能问题非常有用。

要使用MySQL的profile功能,你可以按照以下步骤进行操作:

  1. 打开MySQL客户端,以管理员或具有适当权限的用户身份登录到MySQL服务器。

  2. 在执行查询之前,使用以下命令启用profile功能:

    SET profiling = 1;
    

    这将启用profile功能,并将性能信息记录到MySQL服务器的内存中。

  3. 执行你想要分析的查询语句。

  4. 当查询完成后,使用以下命令查看profile结果:

    SHOW PROFILES;
    

    这将显示所有执行过的查询的列表,包括每个查询的标识符和执行时间。

    示例截图如下图2.3-1所示:

    在这里插入图片描述

  5. 选择你想要查看详细信息的查询,使用以下命令查看该查询的profile结果:

    SHOW PROFILE FOR QUERY <query_id>;
    

    \<query_id>替换为你要查看的查询的标识符。

    在这里插入图片描述

  6. 这将显示该查询的详细profile结果,包括每个阶段的耗时、扫描的行数、使用的临时表等。

注意,使用完profile功能后,应使用以下命令禁用profile功能,以避免对性能产生额外的开销:

SET profiling = 0;

MySQL的profile功能对于优化查询和发现性能问题非常有用,但在生产环境中使用时应谨慎,以避免对系统性能造成过大的影响。

2.4 explain

2.4.1 概述

EXPLAIN是MySQL提供的一个关键字,用于分析查询语句的执行计划。通过EXPLAIN,你可以获取关于查询语句的详细信息,包括查询的表、使用的索引、连接类型、扫描行数等等。这些信息对于优化查询和理解查询性能非常有帮助。

要使用EXPLAIN,你可以按照以下步骤进行操作:

  1. 打开MySQL客户端,以管理员或具有适当权限的用户身份登录到MySQL服务器。

  2. 在客户端中,使用以下语法来执行EXPLAIN并分析查询语句:

    EXPLAIN your_query;
    

    将"your_query"替换为你要分析的查询语句。

  3. 执行上述命令后,MySQL将返回一个关于查询执行计划的结果集,包含多列的信息,如下所示:

    • id: 查询的唯一标识符,用于区分不同的查询。
    • select_type: 查询类型,包括简单查询、联接查询、子查询等。
    • table: 查询涉及的表名。
    • partitions: 查询涉及的分区。
    • type: 表访问的类型,如全表扫描、索引扫描等。
    • possible_keys: 可能使用的索引。
    • key: 实际使用的索引。
    • key_len: 使用的索引长度。
    • ref: 列与索引之间的关联。
    • rows: 预计扫描的行数。
    • filtered: 通过条件过滤的行占比。
    • Extra: 其他额外的信息,如是否使用了临时表、使用的排序方式等。

    这些列提供了关于查询执行计划的详细信息,你可以根据这些信息来优化查询语句,例如选择更合适的索引、优化连接方式等。

通过使用EXPLAIN,你可以更好地理解查询语句的执行方式,并进行性能优化。这对于大型数据库和复杂查询尤为重要。

示例有student,course,student_course三张表,学生表与课程表直接通过学生选课表多对多关联。

2.4.2 重点解析

  • id :select 查询的序列号,表示查询中执行select子句或者操作表的顺序(id相同,执行顺序从上到下;id不同,值越大,越先执行);

示例:

  1. 查看所有学生选课情况执行计划

    • sql语句
    explain select s.*, c.* from student s, course c, student_course sc where s.id = sc.studentid and sc.courseid = c.id;
    
    • 查询结果
    • id select_type table partitions type possible_keys key key_len ref rows filtered Extra
      1 SIMPLE s ALL PRIMARY 4 100.00
      1 SIMPLE sc ALL fk_courseid,fk_studentid 6 33.33 Using where; Using join buffer (hash join)
      1 SIMPLE c eq_ref PRIMARY PRIMARY 4 gaogzhen.sc.courseid 1 100.00
  2. 查询选修了MYSQL课程的学生信息(子查询)

    • explain select * from student s where s.id in (
      	select studentid from student_course sc where sc.courseid = (
      		select id FROM course c where c.NAME = 'MYSQL'
      	)
      );
      
    • id select_type table

      1 PRIMARY
      1 PRIMARY s
      2 MATERIALIZED sc
      3 SUBQUERY c

  • type: 表示连接类型,性能有好到差的连接类型为NULL、system、const、eq_ref、ref、range、index、all。

  • 优化原则尽量向前优化;

  • NULL:不访问任何表,比如select 1;

  • system:使用系统表;

  • const:使用主键或者唯一索引;

    在这里插入图片描述

  • ref:使用非唯一索引;

    在这里插入图片描述

  • All:全表扫描,性能很低。

结语

如果小伙伴什么问题或者指教,欢迎交流。

❓QQ:806797785

参考链接:

[1]MySQL数据库视频[CP/OL].2020-04-16.p74-78.

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

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

相关文章

仿交易猫链接 跳转APP功能

最新仿交易猫假链接&#xff0c;带有跳转APP功能 下载程序&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

C语言数据结构——循环链表

如果人生会有很长,愿有你的荣耀永不散场。——《全职高手》 一 . 循环单链表 循环单链表是单链表的另一种形式&#xff0c;其结构特点是&#xff0c;链表中最后一个结点的指针域不再是结束标记&#xff0c;而是指向整个链表的第一个结点&#xff0c;从而使链表形成一个环。 和单…

PLC现场安装和维护的注意事项

虽然PLC是专门在现场使用的控制装置&#xff0c;在设计制造时已采取了很多措施&#xff0c;使它对工业环境比较适应&#xff0c;但是为了确保整个系统稳定可靠&#xff0c;还是应当尽量使PLC有良好的工作环境条件&#xff0c; 并采取必要的抗干扰措施。因此&#xff0c;PLC在安…

python中,unicode对象怎么转换成dict?

python中&#xff0c;unicode对象怎么转换成dict&#xff1f; 使用loads两次

「展会前线」易天光通信盛装亮相2023越南通讯展会

2023年6月7日&#xff0c;在历经了忙碌有序的前期准备工作后&#xff0c;易天光通信销售团队带着满满的信心踏上了越南通讯展会之旅&#xff01; “千呼万唤始出来&#xff0c;犹抱琵琶半遮面”。2023年6月8日&#xff0c;各方期待已久的2023越南通讯展会在越南胡志明市正式开…

肠道有害菌属——假单胞菌属(Pseudomonas),多变且适应性强

谷禾健康 假单胞菌属&#xff08;Pseudomonas&#xff09;是最多样化和普遍存在的细菌属之一&#xff0c;其物种存在于沉积物、临床样本、植物&#xff08;或植物根际&#xff09;、患病动物、水、土壤、海洋、沙漠等&#xff0c;这反映在它们多变的代谢能力和广泛的适应环境的…

3款好用的客户系统管理软件推荐,你用过哪款?

进行客户资料管理确实很重要。我本人在工作中也常常遇到客户关系管理的难题&#xff0c;有时候忘记填写客户信息&#xff0c;亦或是填错信息等场景&#xff0c;甚至会造成许多尴尬局面。为了解决这个问题&#xff0c;我也试用了很多个方法来提高效率。下面我想谈一谈我本人在摸…

十肽-4/Decapeptide-10, CG-IDP2——有效逆转皮肤衰老

简介----十肽-4 十肽-4可以穿透真皮增加胶原蛋白&#xff0c;通过从内至外的重建来逆转皮肤老化的过程&#xff1b;刺激胶原蛋白、弹力纤维和透明质酸增生&#xff0c;提高肌肤的含水量和锁水度&#xff0c;增加皮肤厚度以及减少细纹。 功效与应用----十肽-4 抗皱抗衰老 改善…

浪潮 KaiwuDB x 大数据中心 | 数据驱动政府治理能力快速提升

业务背景 我国工业互联网大数据资源存在孤立、分散、封闭等问题&#xff0c;数据价值未能得到有效利用&#xff0c;数据主权和数据安全面临重大威胁。 发挥数据对工业经济的基础支撑和创新引擎作用&#xff0c;可促进工业互联网的创新发展&#xff0c;加速数据驱动政府治理能…

Pycharm中的find usages有什么用?

问题描述&#xff1a;我们经常使用Pycharm作为开发工具&#xff0c;我们右键会发现有个find usages功能。 比如&#xff0c;我们以YOLOv8中的detect/train.py中的DetectionTrainer()类为例&#xff0c;右键之后如下图所示。 答案&#xff1a;全局搜索&#xff0c;查找类、变量…

「最新」Parallels Desktop 18 for Mac(Pd虚拟机) 18.3.1通用版

Parallels Desktop 18是一款虚拟机软件&#xff0c;能够让Mac电脑上运行Windows、Linux和其他操作系统的应用程序。 此版本的Parallels Desktop 18提供了多项功能增强和改进&#xff0c;包括更快的性能、更好的图形处理、更简单的导入和导出虚拟机等。该软件还支持Apple M1芯片…

QT使用按钮打开新窗口

需求说明&#xff1a;主窗口名为mainwindow&#xff0c;在主窗口添加一个按钮&#xff0c;通过点击按钮能打开一个新的窗口。 第一步&#xff1a;在主窗口添加按钮 找到左边菜单栏的按钮控件拖出置窗口上 第二步&#xff1a;在工程里新建窗口 1.右击最顶层项目文件名&#x…

Springcloud之Feign、Hystrix、Ribbon如何设置超时时间

一&#xff0c;概述 我们在微服务调用服务的时候&#xff0c;会使用hystrix、feign和ribbon&#xff0c;比如有一个实例发生了故障而该情况还没有被服务治理机制及时的发现和摘除&#xff0c;这时候客户端访问该节点的时候自然会失败。 所以&#xff0c;为了构建更为健壮的应…

Vue3系列--provide与inject

目录 Provide inject 在Vue3项目开发的过程中&#xff0c;会创建很多组件&#xff0c;那么避免不了组件之间的通信&#xff0c;在父子组件通信我们可以使用defineProps、defineEmits、defineExpose和Emit方法完成通信&#xff0c;在使用这些方法的前提是需要引用对应的组件。…

第36步 深度学习图像识别:TensorFlow-gpu环境配置

基于WIN10的64位系统演示 一、写在前面 从这一期开始分享基于深度学习图像识别的学习笔记和代码&#xff0c;相比于之前的ML分类模型&#xff0c;图像识别的门槛会更高&#xff0c;包括硬件方面、代码复杂度和基础理论知识等。同样&#xff0c;首先把必要的深度学习框架&…

Nginx 轻松搞定跨域问题

当你遇到跨域问题&#xff0c;不要立刻就选择复制去尝试&#xff0c;请详细看完这篇文章再处理&#xff0c;我相信它能帮到你。 分析前准备&#xff1a; 前端网站地址&#xff1a;http://localhost:8080 服务端网址&#xff1a;http://localhost:59200 首先保证服务端是没有…

微软将GitHub Copilot 与 Visual Studio 深度整合有助于便捷开发

近日对于很多的开发者来说将迎来一个好消息&#xff0c;据悉微软目前正在改善Visual Studio的开发体验&#xff0c;并将GitHub Copilot更深度融合入Visual Studio 中&#xff0c;以提升“AI 写代码”的准确性。 值得注意的是&#xff0c;在Copilot 1.84 版本之前&#xff0c;…

亚马逊养号系统之亚马逊批量养号如何操作?

亚马逊新注册的买家号都是需要先养一段时间才可以的&#xff0c;如果想要同时养大量的买家号那么需要借助软件进行辅助操作才行。 亚马逊鲲鹏系统可以批量养亚马逊买家号&#xff0c;养号方法有两种&#xff0c;一种是AI智能一键养号&#xff0c;一种是设置关键词搜索浏览后进行…

编译 Keras 模型

本篇文章译自英文文档 Compile Keras Models 作者是 Yuwei Hu 更多 TVM 中文文档可访问 →TVM 中文站。 本文介绍如何用 Relay 部署 Keras 模型。 首先安装 Keras 和 TensorFlow&#xff0c;可通过 pip 快速安装&#xff1a; pip install -U keras --user pip install -U …

代码随想录算法训练营第五十五天|392.判断子序列|115.不同的子序列

LeetCode392.判断子序列 动态规划五部曲&#xff1a; 1&#xff0c;确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a;dp[i][j] 表示以下标i-1为结尾的字符串s&#xff0c;和以下标j-1为结尾的字符串t&#xff0c;相同子序列的长度为dp[i][j]。注意这里…