0202性能分析-索引-MySQL

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.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

V5.0.X版本 EMQX安装、卸载 以及使用

V5.0.X版本 EMQX安装、卸载 以及使用 一、卸载二、下载安装2.1 下载2.2 安装2.2.1 rpm安装2.2.2 tar安装 2.3 测试启动 三、EMQX使用 回到目录    回到末尾 EMQX为大规模分布式物联网 MQTT 消息服务器。提供高效可靠连接海量物联网设备&#xff0c;实时处理分发消息与事件流数…

leangoo领歌敏捷工具中,如何快速查看项目内所有任务卡片

项目管理员能不能快捷的查看整个项目内的所有任务&#xff1f; 能不能快捷查看项目内某一个成员的所有任务&#xff1f; 能不能快捷的在项目内通过一些条件选择查看任务&#xff1f; 可以导出项目内某一个人的所有任务吗&#xff1f;方便做一些统计 等等... 这些现在Leang…

武职301班-day01

实现永和小票页面 效果图 问题分析 把一个大的开发任务&#xff0c;先进行任务分析&#xff0c;把完成这个任务需要的技术点和开发步骤写出来。 开发分析 特点&#xff1a; htmlcss实现 1&#xff09;小票有宽度限制 2&#xff09;字体大小不一样&#xff0c;大部分字体大小…

解决获取taro全局配置文件失败,找不到配置文件失败问题

问题&#xff1a;这会导致项目初始化不成功&#xff0c;即要用vuets生成项目的话&#xff0c;依旧是wxml&#xff0c;js的文件&#xff0c;而不是vue文件 解决一&#xff1a;首先找到配置文件目录 删除taro开头的三项文件&#xff0c;再去node_modules下删除tarojs 然后去终…

Python的基础语法知识

1、变量 变量是一个代号&#xff0c;它代表的是一个数据。 在Python中&#xff0c;定义一个变量的操作包含两个步骤&#xff1a; ①为变量起一个名字 ②为变量指定其所代表的数据 这两个步骤在同一行代码中完成。 1.1 变量的命名规则 变量名可以由任意数量的字母、数字、下划…

实验五 标准ACL的配置【网络安全】

实验五 标准ACL的配置【网络安全】 前言推荐实验五 标准ACL的配置问题方案步骤 最后 前言 2023-6-8 18:54:22 以下内容源自《【网络安全】》 仅供学习交流使用 推荐 配置标准ACL 实验五 标准ACL的配置 问题 络调通后&#xff0c;保证网络是通畅的。同时也很可能出现未经…

vscode Delete `␍⏎·····`

在公司电脑首次拉取代码的时候&#xff0c;好多代码报错&#xff0c;在网上查了博客&#xff0c;确定是换行导致&#xff0c;但是参考网上的解决办法&#xff0c;没有解决&#xff0c;不管是设置 auto 还是命令行执行什么什么的&#xff0c;都不管用 下面介绍我的办法 首先&a…

CloudFlare系列--使用第三方来自定义CDN的IP(笨牛简洁版)

原文网址&#xff1a;CloudFlare系列--使用第三方来自定义CDN的IP(笨牛简洁版)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍CloudFlare的CDN如何自定义第三方IP。 概述 CloudFlare官网接入域名的方式只能是 NS 接入&#xff0c;这样默认DNS服务器只能改为CloudFlare的D…

Hibernate框架【五】——基本映射——多对多映射

系列文章目录 Hibernate框架【三】——基本映射——一对一映射 Hibernate框架【四】——基本映射——多对一和一对多映射 基本映射——多对多映射 系列文章目录前言一、多对多映射是什么&#xff1f;二、hibernate多对多关联映射&#xff08;单向&#xff09;1.实体结构2.示意…

大麦一键生成订单截图 大麦生成购票链接

一键生成订单截图&#xff0c;生成购票链接 已对接支付 下载程序&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

【并发篇】04-05 线程池核心参数代码演示

B站 黑马程序员 java八股的视频笔记 自留备忘 如有错误请多多指教。 &#xff08;一&#xff09;理论知识 这道题其实就是在问java中线程池的实现类ThreadPoolExecutor&#xff0c;这个类参数最多的构造方法有7个参数。 线程池本质上就是管理一组线程&#xff0c;用来执行提交…

2023最新最全面Java复习路线(含P5-P8),已收录 GitHub

小编整理出一篇 Java 进阶架构师之路的核心知识&#xff0c;同时也是面试时面试官必问的知识点&#xff0c;篇章也是包括了很多知识点&#xff0c;其中包括了有基础知识、Java 集合、JVM、多线程并发、spring 原理、微服务、Netty 与 RPC 、Kafka、日记、设计模式、Java 算法、…

音视频技术开发周刊 | 297

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 Geenee AR为品牌商和零售商提供虚拟试穿应用 这意味着Geenee AR的虚拟试穿解决方案能够与品牌商现有的销售渠道无缝集成。 谁说苹果掉队了&#xff1f;WWDC上只字未提AI&a…

九种分布式ID解决方案

背景 在复杂的分布式系统中&#xff0c;往往需要对大量的数据进行唯一标识&#xff0c;比如在对一个订单表进行了分库分表操作&#xff0c;这时候数据库的自增ID显然不能作为某个订单的唯一标识。除此之外还有其他分布式场景对分布式ID的一些要求&#xff1a; 趋势递增&#…

java SSM 宿舍管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM 宿舍管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/…

JVM零基础到高级实战之内存区域分布与概述

JVM零基础到高级实战之内存区域分布与概述 JVM零基础到高级实战之内存区域分布与概述 文章目录 JVM零基础到高级实战之内存区域分布与概述前言Java语言为甚么优势巨大&#xff1f;总结 前言 JVM零基础到高级实战之内存区域分布与概述 Java语言为甚么优势巨大&#xff1f; 一处…

强大的工具:APISpace IP归属地查询API

引言 IP地址在互联网世界中扮演着重要的角色&#xff0c;对于许多应用程序和服务来说&#xff0c;了解IP地址的归属地信息可以提供有价值的洞察和功能。 在本文中&#xff0c;我们将介绍一种名为IP归属地-IPv4区县级 API 的强大工具&#xff0c;它提供了查询 IP 地址归属地信…

网内计算:可编程数据平面和技术特定应用综述

网内计算&#xff1a;可编程数据平面和技术特定应用综述 摘要——与云计算相比&#xff0c;边缘计算提供了更靠近终端设备的处理&#xff0c;降低了用户体验的延迟。最新的In-Network Computing范例采用可编程网络元素在数据达到边缘或云服务器之前计算&#xff0c;促进了常见…

《百年孤独》15句经典语录

句句都是人生真相&#xff0c;说透了所有人的孤独。 1、生命中曾经有过的所有灿烂&#xff0c;原来终究&#xff0c;都需要用寂寞来偿还。 2、过去都是假的&#xff0c;回忆是一条没有尽头的路。 这句话是最受读者欢迎的一句话&#xff0c;回忆就是一条没有尽头的路&#xf…

【嵌入式环境下linux内核及驱动学习笔记-(16)linux总线、设备、驱动模型之input框架】

目录 1、Linux内核输入子系统概念导入1.1 输入设备工作机制1.2 运行框架1.3 分层思想 2、驱动开发步骤2.1 在init()或probe()函数中2.2 在exit&#xff08;&#xff09;或remove&#xff08;&#xff09;函数中&#xff1a;2.3 上报事件2.4 input驱动要素导图2.5 input驱动的总…