现在的公司数据量一般都比较大,当我们需要同此多个读数据库的操作,会出现什么样的情况呢?
String sql ="insert into info (id,name,age,card,otherinfo)values("+i+",'我是第"+i+"个',"+i%100+",'dsfs"+i+i%37+"','其他信息')";
Mysql.add(sql);
if(i%100==0) {
System.err.println("已插入数据"+i+"个,消耗总时间为:"+(System.currentTimeMillis()-time)+"毫秒");
}
这样写字符串拼接的话,我们用for循环去插入数据,这样的操作可能会出现线程池放不下的原因,我们会进行频繁的连接数据库,释放连接等。
那么我们要怎么进行优化呢?
long time=System.currentTimeMillis();
for(int k=1;k<=500;k++) {
StringBuilder sql =new StringBuilder("insert into t_userinfo (id,name,age,card,otherinfo)values");
int start=k*20000;
for(int i=start;i<=start+20000;i++) {
sql.append("(");
sql.append(i);
sql.append(",'我是第");
sql.append(i);
sql.append("个',");
sql.append(i%100);
sql.append(",'dsfs");
sql.append(i+i%37);
sql.append("','其他信息')");
if(i<start+20000) {
sql.append(",");
}
}
MysqlUtil.add(sql.toString());
System.out.println("已插入数据"+(k*20000)+"个,消耗总时间为:"+(System.currentTimeMillis()-time)+"毫秒");
}
System.out.println("消耗总时间为:"+(System.currentTimeMillis()-time)+"毫秒");
我们可以利用StringBuilder进行字符串的拼接,这样我们只进行一次数据库连接和释放。
当我们原数据有400万,3个索引时,我们进行添加
我们会发现,我们增加的速度600w的数据量之后,增加速度变慢。
那如果我们只有一个索引呢?
由此可见,我们新建的索引太多,也会对我们的增加速度有影响。
当我们用50个线程去访问我们数据,速度又如何呢?
1500w
700w
300w
可见速度变化不大,查询时间小于1s,我们还是可以接受的。