再送一波干货,测试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,一经查实,立即删除!

相关文章

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

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

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…

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、…

http协议与web本质

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

Docker storage driver 选择

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

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

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

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

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

Spring Boot结合thymeleaf

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

视觉测量简介

1.1 视觉测量技术 1.1.1 现代检测技术的发展趋势 检测技术是现代化工业的基础技术之一&#xff0c;是保证产品质量的关键。在现代化的大生产之中&#xff0c;涉及到各种各样的检测。随着工业制造技术和加工工艺的提高和改进&#xff0c;对检测手段、检测速度和精度提出了更…

高并发系统之降级特技

2019独角兽企业重金招聘Python工程师标准>>> 高并发系统之降级特技 博客分类&#xff1a; 架构 在开发高并发系统时有三把利器用来保护系统&#xff1a;缓存、降级和限流。之前已经有一些文章介绍过缓存和限流了。本文将详细聊聊降级。当访问量剧增、服务出现问题&a…

freeradius 3.0 时间限制_创意营销3.0新模式下,易企秀要成为中国的Adobe

近几年&#xff0c;随着大数据和人工智能技术的发展&#xff0c;智能化、程序化营销在国内获得高速发展。从以创意内容、提升效率的工具到现在驱动企业数字化转型的智能营销&#xff0c;营销云在国内的热度与成熟度不断提升。营销云起源于“Enterprise Marketing Software Suit…

抢占式和非抢占式的进程调度

非抢占式&#xff08;Nonpreemptive&#xff09; 让进程运行直到结束或阻塞的调度方式 容易实现 适合专用系统&#xff0c;不适合通用系统 抢占式&#xff08;Preemptive&#xff09; 允许将逻辑上可继续运行的在运行过程暂停的调度方式 可防止单一进程长时间独占…

图形学基础知识

本篇主要给大家介绍图形学基础知识&#xff0c;了解Unity图像渲染机制&#xff0c;以及图像渲染管线流程。 主要是因为伴随着VR/AR的飞速发展&#xff0c;为了满足VR高清高帧率的极限渲染&#xff0c;着色器编程&#xff08;Shader&#xff09;也成为了Unity程序开发人员的必备…

调度队列模型

调度队列模型及准则 1 仅有进程调度的调度队列模型&#xff1a; 每个进程在执行时都可能出现以下三种情况&#xff1a; (1) 任务在给定的时间片内已经完成&#xff0c;该进程便在释放处理机后进入完成状态 (2) 任务在本次分得的时间片内尚未完成&#xff0c;OS便将该任务再放入…

数据库相关整理

一、MySQL 1、mysql如何做分页 mysql数据库做分页用limit关键字&#xff0c;它后面跟两个参数startIndex和pageSize 2、mysql引擎有哪些&#xff0c;各自的特点是什么&#xff1f; http://www.cnblogs.com/ctztake/p/8453990.html 3、数据库怎么建立索引 create index account_…

api接口怎么对接_系统对接项目管理方面怎么做?从一次项目接口对接说起

故事&#xff1a;最近业务方有一个新的业务合作模式&#xff0c;需要与第三方公司进行系统的对接&#xff0c;原本预期2周可以完成的项目&#xff0c;最后要用到3周时间才能完成&#xff0c;出现的现象其实还挺典型的&#xff0c;也不是没遇到过&#xff0c;因为自己这边的进度…

周转时间 平均周转时间 带权周转时间 平均带权周转时间

1.周转时间 2.平均周转时间 平均周转时间是对n个而言的 3.带权周转时间 真正的运行时间指的是进程占有处理机的时间 4.平均带权周转时间 即n个平均的带权周转时间