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

原文:再送一波干货,测试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:

测试代码:

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();}}}

 测试结果:

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

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

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

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

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

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

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

 

 

 

 

 

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

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

测试代码改为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();}}}

 结果截图:

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

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

设置数据库最大连接数12000

测试代码改为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();}}}

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

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

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

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

 小小总结,1.可以自己测试高并发下挑战数据库性能,2. 对索引在查询性能上的强大有一个大概认识  很适合初学者学习了解

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

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

相关文章

同步机制遵循的原则

进程在并发执行时为了保证结果的可再现性&#xff0c;各进程执行序列必须加以限制以保证互斥地使用临界资源&#xff0c;相互合作完成任务。多个相关进程在执行次序上的协调称为进程同步。用于保证多个进程在执行次序上的协调关系的相应机制称为进程同步机制。 所有的进程同步机…

wps html编辑表格,WPS 2017个人版演示word使用技巧(wps2017表格使用技巧)

wps2017是一款非常深受用户喜爱的办公软件。在2017这个新的版本中&#xff0c;依旧继承了它之前兼容免费、体积小、多种界面切换、云办公等众多优秀的功能特点&#xff0c;下面小编就来教大家wps2017的使用方式使用技巧&#xff1a;一、wps2017个人版word使用技巧技巧一&#x…

ubuntu 解决“无法获得锁 /var/lib/dpkg/lock -open (11:资源暂时不可用)”的方法...

在ubuntu系统的termial下&#xff0c;用apt-get install 安装软件的时候&#xff0c;如果在未完成下载的情况下将terminal close。此时 apt-get进程可能没有结束。结果&#xff0c;如果再次运行apt-get install 命令安装如今&#xff0c;可能会发生下面的提示&#xff1a;无法获…

es Update API

2019独角兽企业重金招聘Python工程师标准>>> es Update API 博客分类&#xff1a; 搜索引擎&#xff0c;爬虫 The update API allows to update a document based on a script provided. The operation gets the document (collocated with the shard) from the ind…

聪明人,容易不务实

聪明人拥有很多优势。首先&#xff0c;聪明人的逻辑强、思路灵活&#xff0c;理解事物很快&#xff0c;因而经常很有创意。聪明人本身&#xff0c;也因为经常感觉到自己「快速理解、时有创意」的特质&#xff0c;认为没有什么事情难得倒他。渐渐的&#xff0c;在看待任何事物时…

Linux 线程占用CPU过高定位分析

今天朋友问我一个Linux程序CPU占用涨停了&#xff0c;该如何分析&#xff0c; CPU占用过高&#xff0c;模拟CPU占用过高的情况 先上一段代码&#xff1a; 1 #include <iostream>2 #include <thread>3 #include <vector>4 5 6 int main(int argc, char **argv…

计算机二级常备知识,2020年计算机二级Office考试必备题库资料!

考试资料在手&#xff0c;考试不用愁&#xff01;领报名界面显示计算机二级Office通过率仅21.07%&#xff0c;很多人认为是既费脑子又费时间的考试&#xff0c;可能是方法不对&#xff0c;导致花了很多时间还是考不过&#xff0c;刚刚收到3月考的二级证书啦&#xff0c;马上还有…

MR作业的提交监控、输入输出控制及特性使用

2019独角兽企业重金招聘Python工程师标准>>> MR作业的提交监控、输入输出控制及特性使用 博客分类&#xff1a; hadoop 提交作业并监控 JobClient是用户作业与JobTracker交互的主要接口&#xff0c;它提供了提交作业&#xff0c;跟踪作业进度、访问任务报告及logs、…

ACK和NAK

ACK 英文缩写: ACKnowledge Character在数据通信传输中&#xff0c;接收站发给发送站的一种传输控制字符。它表示确认发来的数据已经接受无误。 NAK 英文缩写: Negative Acknowledgment是否定应答或者非应答的缩写。它是一个用于数字通信中确认数据受到但是有小错误的信号。

http协议与web本质

当你在浏览器地址栏敲入“http://www.csdn.net/”&#xff0c;然后猛按回车&#xff0c;呈现在你面前的&#xff0c;将是csdn的首页了&#xff08;这真是废话&#xff0c;你会认为这是理所当然的&#xff09;。作为一个开发者&#xff0c;尤其是web开发人员&#xff0c;我想你有…

计算机科学与技术考研课程安排,计算机科学与技术(0812)硕士研究生培养方案(一)...

一、培养目标本专业培养掌握马克思主义基本原理、计算机科学与技术基础理论和系统知识&#xff0c;深入了解国内外计算机科学与技术领域新技术和新动向&#xff0c;具备熟练的编程、测试能力&#xff0c;熟练掌握1门外语并具有较强创新和实践能力&#xff0c;能够在计算机科学与…

Docker storage driver 选择

2019独角兽企业重金招聘Python工程师标准>>> Docker storage driver 选择 博客分类&#xff1a; docker 本文的目的是说明&#xff0c;如何在生产环境中选择Docker 的storage driver。以及对应Linux发行版本下Docker storage driver的配置方法。主要参考&#xff0c…

临界资源和临界区

临界资源&#xff1a; 临界资源是一次仅允许一个进程使用的共享资源&#xff0c;各进程采取互斥的方式实现共享的资源。 属于临界资源的硬件有&#xff0c;打印机&#xff0c;磁带机等&#xff1b;软件有消息队列&#xff0c;变量&#xff0c;数组&#xff0c;缓…

手机网站制作html5,【怎么样制作手机网站】如何使用dreamweavercs6建立手机网站?织梦手机WAP浏览模块如何制作手机网站?如何制作html5手机页面?...

【怎么样制作手机网站】如何使用dreamweavercs6建立手机网站?织梦手机WAP浏览模块如何制作手机网站?如何制作html5手机页面?下面就和小编一起来看看吧!如何使用dreamweavercs6建立手机网站?制作步骤如下:1。打开DreamweaverCS6软件&#xff0c;可以在DreamweaverCS6软件的开…

Docker查看关联容器的卷宗在本机的存储位置

docker inspect -f {{.Volumes}} volume1转载于:https://www.cnblogs.com/toSeeMyDream/p/8623430.html

《那些年啊,那些事——一个程序员的奋斗史》转载1到7

段伏枥&#xff0c;一个瘦小&#xff0c;矮小&#xff0c;根本和“帅”这个字粘不上任何关系的普通人。名字的来源在于其多读了几年书的老爹&#xff0c;总抱着有一天要出书出名乃至于名流千古的美好理想&#xff0c;但可惜现实总是给予他无情的而又现实的打击&#xff0c;于是…

如果在docker中部署tomcat,并且部署java应用程序

2019独角兽企业重金招聘Python工程师标准>>> 如果在docker中部署tomcat,并且部署java应用程序 博客分类&#xff1a; docker 1、先说如何在docker中部署tomcat 第一步&#xff1a;root用户登录在系统根目录下创建文件夹tomcat7,命令如&#xff1a;mkdir tomcat7&…

原语

一般地&#xff0c;把系统态下执行的某些具有特定功能的程序段成为原语。原语有两种&#xff1a;1是机器指令级的&#xff0c;其特点是执行期间不允许中断&#xff0c;正如在物理学中的原子一样&#xff0c;在操作系统中是一个不可分割的基本单位。2是功能型的&#xff0c;其特…

Spring Boot结合thymeleaf

之前在Eclipse里写了个Spring Boot响应jsp的小demo&#xff0c;后来发现打成jar包导出之后找不到jsp文件了。经过在网上查阅信息与资料&#xff0c;发现Spring Boot对于jsp的支持其实是不好的&#xff0c;而且在一些书中和官方都明确表示没有办法支持在jar包中打入jsp文件。虽然…