千万级的数据量,我们的sql怎么优化呢?

现在的公司数据量一般都比较大,当我们需要同此多个读数据库的操作,会出现什么样的情况呢?

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,我们还是可以接受的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值