性能分析之MySQL索引实战案例

news2024/9/21 19:08:42

文章目录

  • 一、前言
  • 二、准备
  • 三、MySQL索引优化
  • 四、MySQL 索引知识回顾
  • 五、总结

一、前言

在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引?

  • 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP

二、准备

打开IDEA找到登录请求资源路径位置,代码如:

@PostMapping(value = "/login")
public BaseResponseInfo login(@RequestParam(value = "loginName", required = false) String loginName,
                    @RequestParam(value = "password", required = false) String password,
                    HttpServletRequest request)throws Exception {

**步骤1:**找到登录 Controller 调 service 位置
在这里插入图片描述

**步骤2:**找到方法实现层:
在这里插入图片描述
解释:
从上面代码可以看出,用户登录传入用户名密码,代码根据用户去DAO层去查询是否有该用户;
在这里插入图片描述
说明:Dao层就是常规写法,没有什么特别地方,再跳转xml文件查看SQL是怎么写的:
在这里插入图片描述

说明:根据条件查询全部数据,既然这是登录接口传入的是用户名,那么应该在用户名处增加用户索引,这样查询能加快速度;

索引类似于字典目录,通过索引能快速找到响应数据;

在这里插入图片描述
解释:
如果查询为空或者查询结果为0表示数据库么有数据直接返回用户不存在,如果存在在往下走走;
在这里插入图片描述
解释:
如果上面都通过,这里又根据用户名密码查询数据库,这里作者为什么要查询两次数据库,既然上面已经查询完全可以在内存做判断;假如数据库有1000千用户数,每个用户登录都需要查询两次数据,也是一笔不小的开支;

三、MySQL索引优化

上面已经发现索引有问题,但是发现用户表数据很少,第一步先增加用户数据,再通过JMeter进行压测,造数据在性能测试中是常见的事件,这次造数据直接通过 java for 循环造数据,代码参考如下:


/**
 * @description: 注册用户
 * @author: 李文
 * @create: 2021-03-19 21:03
 **/
@RunWith(SpringRunner.class)
@SpringBootTest
public class LoginRegTest {

    @Resource
    private UserMapper userMapper;

    @Test
    public void contextLoads() {


        try {
            for (int j = 0; j < 100; j++) {
                for (int i = 0; i < 1000; i++) {
                    UserEx userEx = new UserEx();
                    userEx.setLoginName(RandomUtil.randomString(10));
                    userEx.setUsername(RandomUtil.randomString(8));
                    userEx.setEmail(RandomUtil.randomInt(1, 1100) + "@7DGroup.com");
                    userEx.setPassword(Tools.md5Encryp(BusinessConstants.USER_DEFAULT_PASSWORD));
                    userEx.setIsystem(BusinessConstants.USER_NOT_SYSTEM);
                    userEx.setIsmanager(BusinessConstants.USER_NOT_MANAGER);
                    userEx.setStatus(BusinessConstants.USER_STATUS_NORMAL);
                    userMapper.insert(userEx);
                }
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}

再次打开MySQL客户端输入如下SQL语句:

mysql> SELECT count(*) from `jsh_user`;
+----------+
| count(*) |
+----------+
| 333724   |
+----------+
1 行于数据集 (0.07)

mysql> SELECT count(*) from `jsh_user`;

EXPLAIN SELECT id,username,login_name, PASSWORD,position, department, email, phonenum, ismanager, isystem, STATUS, description, remark, tenant_id
FROM
  jsh_user
WHERE
  (
    login_name = "admin"
    AND PASSWORD = "e10adc3949ba59abbe56e057f20f883e"
    AND STATUS = 0
  );
+----------+
| count(*) |
+----------+
| 333724   |
+----------+
1 行于数据集 (0.05)

+----+-------------+----------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra       |
+----+-------------+----------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| 1  | SIMPLE      | jsh_user | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 331551 | 0.10     | Using where |
+----+-------------+----------+------------+------+---------------+------+---------+------+--------+----------+-------------+
1 行于数据集 (0.06)

mysql> 
 

截图如下:
在这里插入图片描述
为了减少性能消耗,这次都采用后台运行,把项目跑起来显示如下:
在这里插入图片描述
JMeter运行结果如下:
在这里插入图片描述

liwen@liwen123 hunhe % jmeter -n -t he1.jmx
Creating summariser <summary>
Created the tree successfully using he1.jmx
Starting standalone test @ Fri Mar 19 22:01:53 CST 2021 (1616162513949)
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
summary +     44 in 00:00:06 =    7.8/s Avg:   534 Min:   472 Max:   910 Err:     0 (0.00%) Active: 9 Started: 9 Finished: 0
summary +    336 in 00:00:30 =   11.2/s Avg:  2129 Min:   537 Max:  3626 Err:     0 (0.00%) Active: 30 Started: 30 Finished: 0
summary =    380 in 00:00:36 =   10.7/s Avg:  1944 Min:   472 Max:  3626 Err:     0 (0.00%)

运行几分钟结果如下:
在这里插入图片描述
MySQL增加索引语句:

ALTER TABLE `jsh_user` ADD INDEX index_name ( `login_name` )

增加索引结果如下:

在这里插入图片描述
调优结果:

在这里插入图片描述
JMeter后台数据如下:

在这里插入图片描述
说明:
通过直接增加索引TPS明显增加;

四、MySQL 索引知识回顾

MySQL索引分为:
(1)主键索引 PRIMARY KEY:它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。
(2) 唯一索引 UNIQUE:

ALTER TABLE table_name ADD UNIQUE (column)

(3) 普通索引 INDEX

ALTER TABLE table_name ADD INDEX index_name (column)

(4) 组合索引 INDEX

ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3)

(5) 全文索引 FULLTEXT

ALTER TABLE table_name ADD FULLTEXT (column)

查看索引:

mysql> show index from  jsh_user;
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| Table    | Non_unique | Key_name   | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible |
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| jsh_user | 0          | PRIMARY    | 1            | id          | A         | 3           | NULL     | NULL   |      | BTREE      |         |               | YES     |
| jsh_user | 1          | index_name | 1            | login_name  | A         | 331551      | NULL     | NULL   |      | BTREE      |         |               | YES     |
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
2 行于数据集 (0.02)

mysql>

删除索引:

ALTER TABLE  jsh_user DROP INDEX  index_name;

更多MySQL性能分析请参考《性能测试实战30讲》中的:

  • 《22丨MySQL:数据库级监控及常用计数器解析(上)》
  • 《23丨MySQL:数据库级监控及常用计数器解析(下)》

五、总结

性能优化是一个反复验证尝试的过程,但调优步骤是有逻辑。在这一节中通过观察代码步骤来跟踪并理解为什么在用户名上面增加索引,通过边压测边增加索引看到调优结果。

相关系列:

  • 性能工具之 JMeter ajax 简单登录案例实战
  • 性能工具之 JProfiler 简单登录案例分析实战

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

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

相关文章

Windows系统引入全新 Android 体验?快来尝鲜!

听说微软 Windows 11 操作系统引入全新体验 &#xff1a;实时访问 Android 设备图片。 意思就是在Android 设备上捕获了新照片或屏幕截图时&#xff0c;Windows 上立刻收到通知&#xff0c;且可以不用插数据线就能访问。 用Windows连接手机的功能其实早在Windows10就已经有的了…

【进阶篇】应届毕业生必备:机器学习面试题指南【2】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发…

总线概述

CPU能通过地址总线给主存、硬盘、打印机通过地址总线发送地址&#xff0c;CPU可以通过数据总线和其他的部件进行信息传输&#xff0c;地址总线和数据总线可以并行传输很多位信息&#xff0c;为什么呢&#xff1f;因为每个总线可能由很多跟信号线组成的。CPU可以通过控制总线给其…

锐捷交换机常用命令

文章目录 1. 基本操作命令2. 接口配置3. VLAN配置4. 链路聚合5. 生成树协议6. 端口安全7. 常用查看命令8. 系统管理9. 配置端口镜像10. 配置生成树协议 1. 基本操作命令 进入特权模式&#xff1a;enable 进入全局配置模式&#xff1a;configure terminal 保存配置&#xff1a;…

在线plotly绘制动态旭日图,展示复杂数据层次结构

探索数据的层次之美&#xff1a;旭日图&#xff0c;以环环相扣的视觉效果&#xff0c;清晰展现数据的层级关系。搭配Plotly的动态可视化技术&#xff0c;不仅让数据层次一目了然&#xff0c;更通过交互式操作&#xff0c;让用户轻松探索每个层级的详细信息&#xff0c;享受数据…

国内web组态推荐

万维组态是一款功能强大的基于Web的可视化组态编辑器&#xff0c;采用标准HTML5技术&#xff0c;基于B/S架构进行开发&#xff0c;支持WEB端呈现&#xff1b; 支持在浏览器端完成便捷的人机交互&#xff0c;简单的拖拽即可完成可视化页面的设计;可快速构建和部署可扩展的SCADA…

关于百度翻译以及这三款好用的翻译推荐!!

今天咱来聊聊在线翻译工具&#xff0c;尤其是百度翻译&#xff0c;以及我超爱的其他几款翻译工具。如果你跟我一样&#xff0c;经常要处理多语言文件&#xff0c;或者想快速了解外国文化&#xff0c;那么这些工具绝对是你的好帮手&#xff1a; 关于百度翻译 先说说我日常用的…

低温烧结银AS9378火爆的六大原因

低温烧结银AS9378火爆的六大原因 低温烧结银AS9378近年来在电子材料领域迅速崛起&#xff0c;其火爆程度令人瞩目。这款采用纳米技术和低温烧结工艺的高性能材料&#xff0c;凭借其独特的优势在众多应用中脱颖而出。以下&#xff0c;我们将深入探讨低温烧结银AS9378火爆的六大原…

纷享销客生态伙伴大会北京站成功举办,共谋数智新未来

9月5日&#xff0c;主题为“智享未来 领创CRM新纪元”的纷享销客生态伙伴大会北京站圆满落幕&#xff0c;此次盛会吸引了超过600位来自不同行业的精英代表、企业领袖、技术专家等汇聚一堂&#xff0c;共同探讨CRM领域的最新趋势、创新实践与未来机遇。 01、智享未来&#xff0…

idea修改内存设置后,启动没反应 Error opening zip file or JAR manifest missing :

Error opening zip file or JAR manifest missing :一个路径 解决办法 删除环境变量中的路径 重装idea

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始&#xff0c;按照书籍的划分&#xff0c;第10章开始就进入保护模式&#xff08;Protected Mode&#xff09;部分了&#xff0c;感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断&#xff08;Interrupt&#xff09;的设计&#…

idea开发Java程序的步骤及设置

project中可以创建多个module&#xff0c;module中可以创建多个package。package中可以创建多个class。 idea中的Java程序是自动编译和执行的&#xff0c;编译后的class文件在工程路径下的一个out文件夹里。 IDEA中设置主题、字体 IDEA常用快捷键

Ubuntu20如何设置网络

如图设置静态地址 第1步&#xff1a; 查看当前主机的网卡名&#xff0c;当前ip, 子网掩码&#xff0c;网关地址 ifconfig route -n 如果ifconfig命令无法使用, 请运行以下命令安装net-tools sudo apt update -y sudo apt install net-tools -y 如上图所示&#xff1a;网卡名为 …

Cesium 展示——实现雾的天气效果模拟

文章目录 需求分析1. 添加2. 移除需求 Cesium 完成雾的天气效果模拟 分析 1. 添加 源码case

C语言-qosrt函数—秩序大师

1、qsort()的作用 在我们的日常生活中&#xff0c;排序无处不在。想象一下&#xff0c;当你整理书架时&#xff0c;会按照书籍的类别、作者或者大小进行排列&#xff0c;让你的阅读空间更加整洁有序。又比如&#xff0c;在超市的货架上&#xff0c;商品通常也是按照一定的规则进…

启动与登录Mysql

1.启动与停止MYSQL服务 启动MySQL 服务的命令 以管理员身份打开Windows 的命令行窗口&#xff0c;在命令提示符后输入以下命令启动MySQL 服务&#xff1a; net start[ 服务名称] 也可以直接输入以下命令&#xff1a; net start 按【Enter】键执行该命令&#xff0c;默认启…

测试网站dddd

Selenium PostmanpythonPytest

揭秘InnoDB:为何MySQL选择B+树作为索引结构

我们知道MySQL数据库InnoDB引擎索引的数据结构是B树&#xff0c;那他为什么不用红黑树&#xff0c;不用B树呢&#xff1f;用B树的优点在哪里&#xff1f;解决了些什么问题&#xff1f; 下面将以这几个疑问点为中心记录一下MySQL选用B树的原因。 揭秘InnoDB&#xff1a;为何MyS…

模型训练如何实现自动化输出评估报告、模型、特种平台

模型训练如何实现自动化 1、目标 把对文本分类【体育,教育,娱乐,经济,文学,政治】的模型实现自动化训练。 分类器:贝叶斯、支持向量机、梯度提升、随机森林、逻辑斯蒂回归 通过预设的准确率期望值与训练轮数,获取最优的分类器模型,当模型评估的准确率大于期望值时即…

Linux学习之路 -- 线程控制

前面我们介绍了线程的基础概念&#xff0c;即线程为进程内部的执行分支。下面我们将介绍一下具体的线程控制相关函数。 目录 1、铺垫 2、线程创建 3、线程等待 4、线程异常 5、线程退出 <1>线程函数返回退出 <2>pthread_exit <3>pthread_cancel 6、…