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,一经查实,立即删除!

相关文章

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

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

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

一、https/tls原理 HTTPS访问的三个阶段 第一阶段 认证站点 客户端向站点发起HTTPS请求&#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;可用于多…

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

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

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

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

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

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

【转】医学图像中的窗宽、窗位!!

在CT等医学影像显示领域&#xff0c;我们经常会听到窗宽&#xff08;Window Width,简写WW&#xff09;、窗位&#xff08;Window Level,简写WL&#xff09;的概念&#xff0c;那么到底什么是窗宽、窗位&#xff0c;它们跟医学图像之间的关系又是什么&#xff1f; 先说一下CT值…

【Excel】使用VLOOKUP+IF实现多列条件匹配查询

excel中vlookup函数为精准匹配查找&#xff0c;但此函数局限于单列的精准匹配&#xff0c;如果需求是多列条件进行匹配&#xff0c;怎么通过vlookup函数实现呢&#xff1f; 思路&#xff1a;通过if函数将多列拼成一列再通过vlookup函数进行精准匹配 具体公式为VLOOKUP($F2&…

【转】解密Qt安装目录的结构

转自&#xff1a;C语言中文网 强力推荐 网址&#xff1a;http://c.biancheng.net/view/3866.html 了解 Qt 安装目录的结构虽然不是编程必须的&#xff0c;但是它能练就我们的内功&#xff0c;让我们对 Qt 的编程环境了如指掌。Windows 和 Linux 下 Qt 安装目录的结构非常相似…

发一个自己写的2440驱动1602的资料(电路+代码)

上个星期把MINI2440板上的富余数据线引了出来&#xff0c;看着以前丢下的1602突然有了想用ARM9驱动它的冲动&#xff0c;于是就开始干了。 代码是从以前刚学C51的时候改的&#xff0c;呵呵&#xff0c;看见以前写的代码真觉得很烂&#xff0c;现在已经整理好了。 虽说有点牛刀…

【转】10.Qt编程涉及的术语和名词

本节我们来介绍一下使用 Qt 编程过程中常用的术语和名字&#xff0c;它们不一定专属于 Qt&#xff0c;在其它的 C/C 开发过程中也会使用到。 Project Project 的中文翻译是“项目”或者“工程”&#xff0c;这里的项目是指为实现某个相对独立功能的程序代码合集&#xff0c;这…

【转】17.Qt界面布局管理详解

在上一节&#xff0c;通过一个简单的应用程序&#xff0c;分析了 Qt 创建的 GUI 应用程序中各个文件的作用&#xff0c;剖析了可视化设计的UI文件是如何被转换为 C 的类定义&#xff0c;并自动创建界面的。这些是使用 Qt Creator 可视化设计用户界面&#xff0c;并使各个部分融…

SQL Server 清空或删除所有数据库表中的数据

方法一&#xff1a; --生成数据库脚本的方法最快,处理的也最好 sql2000企业管理器 --右键要清理的数据库 --所有任务 --生成SQL脚本 --<常规>里选择"生成全部对象脚本"","在脚本文件中包含说明性标题&quo…