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

继上篇文章《绝对干货,教你4分钟插入1000万条数据到mysql数据库表,快快进来》发布后在博客园首页展示得到了挺多的阅读量,我这篇文章就是对上篇文章的千万级数据库表在高并发访问下如何进行测试访问

这篇文章的知识点如下:

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个

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

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

相关文章

从高中一次半夜不冲厕所的经历谈程序

我高中的时候&#xff0c;是住校生。寝室到了10点半就会熄灯&#xff0c;早上6点40左右就要起来跑早操。 一天半夜大概两三点&#xff0c;起床放了个大号。想要充厕所的时候发现没有水&#xff0c;很尴尬&#xff0c;也没有其他的办法。半夜还冷的很。就上床睡觉了&#xff0…

Oracle:ORA-28000异常(帐户已被锁定),修改账号登录失败次数

问题描述 最近系统更换了数据库服务器&#xff0c;IP地址也变了&#xff0c;于是就把应用服务器中配置数据库连接的位置做了修改&#xff0c;但是修改后应用起不来了。 经过半天也没发现问题&#xff0c;后来想试试连数据库看看&#xff0c;结果PL/SQL提示“ORA-28000错误”&…

【转】VTK修炼之道1_初识VTK

1.VTK是什么&#xff1f; Visualization ToolKit 3D计算机图形学、图象处理及可视化工具包 VTK使用C、面向对象技术开发&#xff1b;基于OpenGL&#xff0c;封装了OpenGL中的功能&#xff0c;屏蔽细节、便于交互、易于使用提供多种语言接口C&#xff0b;&#xff0b; 、Java 、…

一道解决的非常漂亮的算法题

这是多年以前做的一道题目&#xff0c;原题来自软件报或者电脑报 &#xff0c;我记不清了。解决这个题目有一个关键的步骤&#xff0c;就是要求一个整数在一个整数三角阵中的坐标。这篇blog就是讨论这个求坐标的问题&#xff0c;不是讨论那个报纸上的题目。现在将题目描述如下&…

HTTPS原理和对中间件攻击的预防

一、https/tls原理 HTTPS访问的三个阶段 第一阶段 认证站点 客户端向站点发起HTTPS请求&#xff0c;站点返回数字证书。客户端通过数字证书验证所访问的站点是真实的目标站点。 第二阶段 协商密钥 客户端与站点服务器协商此次会话的对称加密密钥&#xff0c;用于下一阶段的加…

【转】医学影像技术(中国普通高等学校本科专业)

医学影像技术专业培养适应我国社会主义现代化建设和医疗卫生事业发展需要的&#xff0c;德、智、体全面发展&#xff0c;具有基础医学、临床医学和现代医学影像必备的基本理论知识和基本技能&#xff0c;从事临床影像检查、诊断与治疗技术工作的高级技术应用性专门人才。 中文…

Windows CE下流驱动的动态加载

Windows CE下流驱动的动态加载 闲话少说&#xff0c;进入正题。查找EVC的帮助&#xff0c;发现函数ActivateDevice&#xff08;&#xff09;可用来加载驱动程序。而这个函数的使用是相当简单的。我就不多说了&#xff0c;贴上一段帮助最能说明问题。当然&#xff0c;你也可以用…

HTTPS原理全面介绍【备查】

来源&#xff1a;https://www.cnblogs.com/haimishasha/p/11373034.html 目录 应用层协议&#xff1a;HTTPS 1. HTTPS定义 2. 密码学基础  3. HTTP通信问题 4. SSL/TLS协议 5. HTTP 向 HTTPS 演化的过程 5.1 对称加密 5.2 非对称加密 5.3 对称加密非对称加密 5.4 安…

【转】VTK修炼之道2_VTK体系结构1

1.OverView综述 The Visualization Toolkit consists of two basic subsystems: a compiled C class library &#xff08;一个已经编译好的C类库&#xff09;and an “interpreted” wrapper layer&#xff08;一个用于解释的语言层&#xff09; that lets you manipulate the…

WINCE6.0 DM.EXE 激活驱动失败的原因之一

前些天把WINCE6.0的开发环境建好了&#xff0c;今天定制了一个系统&#xff0c;练习了一下驱动的编写和调试。把DLL文件通过VS2005部署到开发板上&#xff0c;用一位大侠写的DM.EXE工具进行激活&#xff0c;但是发现点击激活按钮式无反应&#xff0c;驱动还是停在“停用”状态&…

Linux:tomcat安装/版本升级

本文适用于安装或更新tomcat版本。 1.进入tomcat目录&#xff0c;查看当前tomcat版本 cd /usr/local/tomcat/bin ./version.sh 2.备份原tomcat 可以拷贝原tomcat&#xff0c;或者直接修改原tomcat的文件夹名称作为备份。 cd /usr/local/ #方法1&#xff1a;创建目录&…

【转】VTK与Qt整合的示例

VTK与Qt整合的示例 VTK附带的程序示例中大多是基于控制台的&#xff0c;作为可视化开发工具包&#xff0c;VTK也可以与很多流行的GUI开发工具整合&#xff0c;比如MFC、Qt(题外话&#xff1a;Qt已经被Digia从诺基亚手中收购了&#xff0c;Qt现在的链接是&#xff1a;http://qt…

WinCE驱动调试助手V2.5

http://www.cnblogs.com/we-hjb/archive/2008/12/15/1280822.html http://blog.chinaunix.net/u1/49088/showart.php?id1279989 工欲善其事&#xff0c;必先利其器。做WinCE驱动的开发已有一段时间了&#xff0c;WinCE驱动调试助手也跟着更新了很多功能。现在只要做驱动&#…

Web应用系统中数据传递的方式汇总

本文转载自sina_blog(siangzhang) 目录 1 Socket方式 2 ftp/文件共享服务器方式 3 数据库共享数据方式 4 message方式 5 案例 随着近年来SOA&#xff08;面向服务技术架构&#xff09;的兴起&#xff0c;越来越多的应用系统开始进行分布式的设计和部署。 系统由原来单一…

【转】CT (电子计算机断层扫描)

CT(Computed Tomography)&#xff0c;即电子计算机断层扫描&#xff0c;它是利用精确准直的X线束、γ射线、超声波等&#xff0c;与灵敏度极高的探测器一同围绕人体的某一部位作一个接一个的断面扫描&#xff0c;具有扫描速度快&#xff0c;图像清晰等特点&#xff0c;可用于多…

WinCE驱动的动态加载

// //TITLE: // WinCE驱动的动态加载 //AUTHOR: // norains //DATE: // Monday 22- February-2010 //Environment: // WINDOWS CE 5.0 // WinCE驱动的调试&#xff0c;很多人的第一感觉就是&#xff1a;编写好DLL文件&#xff0c;接着在PB中添加相关注册表信息&am…

Linux:chmod命令-修改文件或目录的权限

给新安装的tomcat/bin目录下的所有文件增加执行权限&#xff08;所有用户、组&#xff09; chmod -R ax /usr/local/tomcat/bin ------------------------------------------------------------------------------------------------------------------- 关于具体的chmod命令…

获取WinCE已加载驱动的信息

// //TITLE: // WinCE驱动的动态加载 //AUTHOR: // norains //DATE: // Monday 22- February-2010 //Environment: // WINDOWS CE 5.0 // WinCE驱动的调试&#xff0c;很多人的第一感觉就是&#xff1a;编写好DLL文件&#xff0c;接着在PB中添加相关注册表信息&am…

【转】详解冠状面_水平面_矢状面_窗宽_窗位

在接触人工智能医疗方面时&#xff0c;单是学习算法和代码原理还不够&#xff0c;需要一定的医学影像知识储备。 B超、CT、MR等都算是医疗影像&#xff0c;在现实生活中&#xff0c;从医院检查身体后拿到的胶片是处理过后的二维图像。这些医疗影像其实是三维的。 最常见的图片格…

js+ asp.Net ajax开发163邮箱效果(列表底色、多选拖动等)--checkBox多选

163邮件一个比较爽的功能就是可以通过多选邮件&#xff0c;拖动到左侧的文件夹列表&#xff0c;实现邮件归类的功能关于我对拖动分配的实现将在后文写出这里说说在CheckBox的选择中做得尝试和实现的效果、方法1。点击表格Title实现全选每行这个早有人做了,我这里借鉴一下 一块贴…