原文:再送一波干货,测试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. 对索引在查询性能上的强大有一个大概认识  很适合初学者学习了解

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

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

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

  2. 绝对干货,教你4分钟插入1000万条数据到mysql数据库表,快快进来

    我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入1000万条数据的时候遇到了一些问题,现在先来解决他们,一开始我插入100万条数据时候报错,控制台的信息如下: ...

  3. 力控数据写入mysQL_绝对干货,教你4分钟插入1000万条数据到mysql数据库表,快快进来...

    我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入1000万条数据的时候遇到了一些问题,现在先来解决他们,一开始我插入100万条数据时候报错,控制台的信息如下: ...

  4. 由于单表数据已经达到2000万数据,所以想分表,现假如分1000万为一单表,例有如一两个表:

    由于单表数据已经达到2000万数据,所以想分表,现假如分1000万为一单表,例有如一两个表: 表a: id    title 1    张三 2    李四 ............ 表b: id   ...

  5. 简单粗暴 我再送一波教程资料,Vue、大数据、AI都有

    点击上方"<

  6. 批量往mysql里面插入1000万条数据_绝对干货,教你4分钟插入1000万条数据到mysql数据库表,快快进来...

    我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入1000万条数据的时候遇到了一些问题,现在先来解决他们,一开始我插入100万条数据时候报错,控制台的信息如下: ...

  7. mysql 单表2000多万条数据,模糊查询如何秒回

    mysql 单表数据2000多万,没有分区.没有表.没有分库,表存储的是企业信息,例如:企业名称.经营范围.注册地址等信息.现在需要通过关键词模糊匹配企业名称,搜索出匹配的数据.因为模糊匹配,所以直接 ...

  8. 放大招了,送一波来自 Facebook、Google、网易、阿里的学习福利!

    过了十一假期,下一个小长假就是元旦了,中间这仨月还是要老老实实上班的,毕竟快到年底了,为了年终奖也要好好表现一下自己. 除了干好份内工作,为了不让后浪拍在沙滩上,我建议你闲暇的时候也要充充电,没准儿学 ...

  9. iOSTips:送一波中秋福利

    今天周五,马上中秋节放假,各位应该都收到了公司送的中秋福利,老峰也送一波,后面老峰会多搞一些活动,如送书.优秀 App 兑换码等,敬请期待.废话不多说,直接上福利! 福利:<iOS面试之道> ...

最新文章

  1. JavaScript之match()方法讲解
  2. iOS开发cocoaPod的使用
  3. 操作系统概述 操作系统第一章知识点归纳总结
  4. 计算机应用技术的历史与现状,浅析计算机应用技术的现状及发展趋势
  5. Python string字符串
  6. linux禁止扫描端口,公网的服务器如何禁止别人扫描端口
  7. 从git repo分支安装pip
  8. C语言课后练习题第二章
  9. dell笔记本驱动安装失败_如何以正确的顺序重新安装驱动程序 | Dell 中国
  10. 数字双极点低通滤波器-二阶巴特沃斯滤波器
  11. 2013年企业邮箱的发展:任重而道远
  12. 对射式光电传感器测速使用CD10406消抖动解决办法
  13. 手机软件测试网络延时,网络延迟怎么检测-测试网络是否延迟的方法 - 河东软件园...
  14. java万年历闹钟节气,闹钟 提醒 万年历 用酷石英钟搞定
  15. AutoLine开源平台发布
  16. BT源代码学习心得(十三):客户端源代码分析(对等客户的连接建立及其握手协议)
  17. 2023.0125.1-edge浏览器与百分浏览器
  18. 最近失业了,在做副业的路上走了很多坑
  19. kafka集群搭建+权限认证(SASL/SCRAM)+整合springboot
  20. lte盲重定向_TD-LTE网络基于PS业务的重定向过程研究

热门文章

  1. 请输入“您的生日”,格式:yyyy-MM-dd,使用程序计算您已经来到这个世界多少天了。
  2. MySQL多个线程同时写数据_多个线程可以同时将数据写入文件吗?
  3. leetcode109. 有序链表转换二叉搜索树
  4. 阿里Java编程规约(集合)
  5. Linux(17)-Make编译,Configure
  6. 算法(26)-最长系列
  7. java i18n实例_Java国际化(i18n)格式化日期
  8. 算法入门篇三 详解桶排序和整理排序知识 堆的相关操作 补充 不完整
  9. 2014年考研英语二作文PartB图表题
  10. 穷人靠力,富人借力!看完你将明白一切!