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:
测试代码:
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个
1000并发 MySQL数据库_再送一波干货,测试2000线程并发下同时查询1000万条数据库表及索引优化...相关推荐
- 再送一波干货,测试2000线程并发下同时查询1000万条数据库表及索引优化
原文:再送一波干货,测试2000线程并发下同时查询1000万条数据库表及索引优化 继上篇文章<绝对干货,教你4分钟插入1000万条数据到mysql数据库表,快快进来>发布后在博客园首页展示 ...
- 一上来,就问原理,问上亿(MySQL)大表的索引优化...
你经历过地狱级的面试吗?血淋淋的教训告诉你 你好,x先生,欢迎来我们公司面试,不用太紧张,我们简单聊一个 好的,谢谢您 看了你的简历,之前对mysql数据库了解挺多的,我们先来聊聊数据库怎么样? 好的 ...
- 一上来,就问原理,问上亿(MySQL)大表的索引优化,我的天...
你经历过地狱级的面试吗?血淋淋的教训告诉你 你好,x先生,欢迎来我们公司面试,不用太紧张,我们简单聊一个 好的,谢谢您 看了你的简历,之前对mysql数据库了解挺多的,我们先来聊聊数据库怎么样? 好的 ...
- mysql千万级数据索引查询_mysql千万级数据量根据索引优化查询速度
(一)索引的作用 索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上就已经 ...
- MySQL一次查几万条数据,【mysql】一次插入几万条数据应该怎么做优化
刚刚去面试,面试官提问了我一次插入几万条数据有什么优化方法,一次更新几万条数据有什么优化方法,这些我之前都没有用过,希望大家给我解一下惑. 回答 1.insert批量执行,禁止单条insert val ...
- 【面试题记录】在mysql中查询10万条数据找到第50000到51000条数据,你会怎么做?
数据库表中准备了10万条数据,今天我们来做一下测试. 数据表:ticket_order_log 主键索引:id 先看一下数据,一共是101176条数据,耗时117s. select * from ti ...
- 3w并发mysql架构_(DBA之路【一】)mysql 基本架构
MySQL是一个可移植的数据库,几乎能在当前所有的操作系统上运行,如Unix/Linux.Windows.Mac和Solaris.各种系统在底层实现方面各有不同,但是MySQL基本上能保证在各个平台上 ...
- mysql 5000万条数据库_1亿条数据如何分表100张到Mysql数据库中(PHP)
下面通过创建100张表来演示下1亿条数据的分表过程,具体请看下文代码. 当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度.笔者做了一个简单的尝试,1亿条数据,分100张表.具体实现过 ...
- aws rds恢复数据库_使用AWS Glue将数据从AWS S3加载到AWS RDS SQL Server数据库
aws rds恢复数据库 This article explains how to develop ETL (Extract Transform Load) jobs using AWS Glue t ...
最新文章
- SecureCRT错误:The client has
- 寻找调用DebugPort的函数
- OpenCV-图像几何变换:旋转,缩放,斜切 .
- lodash源码分析之Hash缓存
- 视觉SLAM十四讲学习笔记-第三讲-旋转矩阵和Eigen库
- 系统功能调用DOS中断INT 21H功能包单字符输入01单字符输出02字符串输入0a字符串输出09
- [R语言绘图]条状图barplot
- 怎么看接收灵敏度desense问题?
- Power Query M语言全部list函数,快速分类掌握
- Python OpenCV 在视频上添加文字后保存视频
- 【数学建模笔记 24】数学建模的时间序列模型
- 命名实体识别主要方法
- 5G消息富媒体最新形态
- doxygen 教程 linux,使用Doxygen生成全中文的chm、pdf帮助文档的方法
- win7 mysql 管理员权限,win7管理员权限问题 TrustInstaller 获取权限
- mimax 刷原生android,小米手机想爽刷原生安卓?不愁!
- 区间缩放,标准化,归一化
- Bitwise Operators
- 使用 Amazon Personalize 快速搭建推荐服务
- MT7628K eCos开发入门
热门文章
- 面试常考题---交换变量
- java中多维数组的clone容易引起误解
- Thread类和Runnable接口
- .netframework3.5 中TimeZoneInfo 类的使用
- 公司间交易学习笔记---概述
- 奇迹世界服务器不响应,sun-奇迹世界 目前常见问题解决方法
- java加载sql2016_SQl Server 2016 with R.
- wampserver php乱码,WampServer搭建php环境可能遇到的问题
- 1668智能下数教程视频_你需要的教程合集更新
- android无线充产品,一天售罄!鲁蛋超薄无线快充太火爆 兼容苹果安卓成最大卖点...