1000并发 MySQL数据库_再送一波干货,测试2000线程并发下同时查询1000万条数据库表及索引优化...

这篇文章的知识点如下:

1.如何自写几十行代码就能模拟测试高并发下访问千万级数据库表

2.比较高并发下(200次/秒,2000次/秒,10000次/秒)数据库的性能

3.比较千万级数据库在查询时加索引与不加索引的巨大差异(说实话,这个测试结果让我自己本人也很惊讶)

针对上篇文章插入的1000万条数据到数据库后,我们进行了高并发下测试(模拟教师输入姓名和密码在1秒内登录数据库),线程类代码如下

package insert;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

public class ThreadToMysql extends Thread {

public String teacherName;

public String password;

public ThreadToMysql(String teacherName, String password) {//构造函数传入要查询登录的老师姓名和密码

this.teacherName=teacherName;

this.password=password;

}

public void run() {

String url = "jdbc:mysql://127.0.0.1/teacher";

String name = "com.mysql.jdbc.Driver";

String user = "root";

String password = "123456";

Connection conn = null;

try {

Class.forName(name);

conn = DriverManager.getConnection(url, user, password);//获取连接

conn.setAutoCommit(false);//关闭自动提交,不然conn.commit()运行到这句会报错

} catch (ClassNotFoundException e1) {

e1.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();

}

if (conn!=null) {

Long startTime=System.currentTimeMillis();//开始时间

String sql="select id from t_teacher where t_name='"+teacherName+"' and t_password='"+password+"'";//SQL语句

String id=null;

try {

Statement stmt=conn.createStatement();

ResultSet rs=stmt.executeQuery(sql);//获取结果集

if (rs.next()) {

id=rs.getString("id");

}

conn.commit();

stmt.close();

conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

Long end=System.currentTimeMillis();

System.out.println(currentThread().getName()+" 查询结果:"+id+" 开始时间:"+startTime+" 结束时间:"+end+" 用时:"+(end-startTime)+"ms");

} else {

System.out.println(currentThread().getName()+"数据库连接失败:");

}

}

}

测试类代码如下:

package insert;

public class TestThreadToMysql {

public static void main(String[] args) {

for (int i = 1; i <=2000; i++) {

String teacherName=String.valueOf(i);

new ThreadToMysql(teacherName, "123456").start();

}

一.在没有加索引的情况下测试:

把数据库的最大连接数设置为250:

ac4d6311b8c370db796486e9c980274b.png

测试代码:

package insert;

public class TestThreadToMysql {

public static void main(String[] args) {

for (int i = 1; i <=200; i++) {

String teacherName=String.valueOf(i);

new ThreadToMysql(teacherName, "123456").start();

}

}

}

测试结果:

7f6d4f57f8eb121e35f05350386a8969.png

100多秒啊。。。我的天,这用户体验也没准了O(∩_∩)O哈哈~

二.加索引后再次进行高并发下测试:

数据库加索引SQL语句如下:这里我有一个疑问,上个星期我加索引等了半个小时我都没加完索引我就停止了,今天下午居然只用了551秒就加完了索引。。。搞不懂

690a0f08a3d129c15d3f28cbd2a566a0.png

clean下项目代码后再次运行(尽量经常clean下项目去掉缓存,不然结果会有出入):

88136bd271a33f08bd13511c84bc3152.png

看到这个结果有没有被惊呆啊?哈哈加了索引由100多秒提升到1~2毫秒,查询速度提示1万多倍,查询性能得到大幅度变态级提升~~~

没加索引之前我查询单个记录都要2秒多

adbeba168cbcc42fcf737c78114a20f7.png

用explain查看语句可以知道要扫描全表,性能当然大幅度下降

8d4cfb694e2359c628168ab71198c25f.png

下面我们来挑战2000线程同时并发访问查询数据库。看看结果:

把数据库最大连接数设置为2500

15c6c376f5af8e10898d474e0279bac3.png

测试代码改为2000

package insert;

public class TestThreadToMysql {

public static void main(String[] args) {

for (int i = 1; i <=2000; i++) {

String teacherName=String.valueOf(i);

new ThreadToMysql(teacherName, "123456").start();

}

}

}

结果截图:

fd8fed63f74b20103e10bea7baf951bd.png

性能没问题,平均几十毫秒,很满意

下面我们来挑战一下1万个线程同时高并发访问,大家可以先想想结果会怎么样,哈哈

设置数据库最大连接数12000

9bdec274934e212fe6f03f06ee6ab543.png

测试代码改为10000(再次提示。clean一下项目去掉缓存,这样结果更准确)

package insert;

public class TestThreadToMysql {

public static void main(String[] args) {

for (int i = 1; i <=10000; i++) {

String teacherName=String.valueOf(i);

new ThreadToMysql(teacherName, "123456").start();

}

}

}

结果如下(运行后发现电脑有点卡):

8b94f80006dc520cb539cc418fbe71b8.png

8eee57414d07c1544d5f5c1dd4cdfd6d.png

结果出现两种报错,1.连接请求被拒绝 2.连接失效 3.不过也有一部分成功连接上并且正确运行

然后我在数据库查看最大连接响应数:

42ec79adffc2f5e0e7627829aa79f794.png

可以看出来就算你的数据库设置为再高你的数据库服务器也响应不过来。。。。顶多响应5758个

7f6d4f57f8eb121e35f05350386a8969.png

100多秒啊。。。我的天,这用户体验也没准了O(∩_∩)O哈哈~

二.加索引后再次进行高并发下测试:

数据库加索引SQL语句如下:这里我有一个疑问,上个星期我加索引等了半个小时我都没加完索引我就停止了,今天下午居然只用了551秒就加完了索引。。。搞不懂

690a0f08a3d129c15d3f28cbd2a566a0.png

clean下项目代码后再次运行(尽量经常clean下项目去掉缓存,不然结果会有出入):

88136bd271a33f08bd13511c84bc3152.png

看到这个结果有没有被惊呆啊?哈哈加了索引由100多秒提升到1~2毫秒,查询速度提示1万多倍,查询性能得到大幅度变态级提升~~~

没加索引之前我查询单个记录都要2秒多

adbeba168cbcc42fcf737c78114a20f7.png

用explain查看语句可以知道要扫描全表,性能当然大幅度下降

8d4cfb694e2359c628168ab71198c25f.png

下面我们来挑战2000线程同时并发访问查询数据库。看看结果:

把数据库最大连接数设置为2500

15c6c376f5af8e10898d474e0279bac3.png

测试代码改为2000

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行和易用,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值