发表于: 2017-05-16 14:23:01

4 1391


今日计划

重新构造数据库

对照任务一验收标准检查

完成剩下的深度思考

写任务总结


今日完成

插入1000万条数据


生成速度慢了一倍以上

数据确实是1000w条

不添加索引的搜索结果

添加索引到name搜索的结果。与昨日结果差别较大,猜测应该是设置了主键的原因,提高了数据库执行效率。


sql语句是select id from entry_form where name=1000000


尝试插入1亿条数据,10线程,每线程1000万条数据,提示内存溢出

set global max_allowed_packet = 100*1024*1024

修改max_allowed_packet为10m,重新执行代码,机器卡死,只能重启


用蠢办法一步步添加吧,机器内存和cpu差了一截。cpu利用率在40%~50%波动。老机器还是不行,尝试用台式机插入一亿条数据。


1亿+数据

加入索引

 

搜索时间明显缩短,可以确定昨天加索引后搜索效率无明显提升的原因是主键缺失了

删除索引,再插1亿条

2亿+行数据

到1分钟啦,现在试试加入索引

优势很明显

通过杨舜师兄的日报,找到一个nb方法检索。200线程并发同时查询数据库表及索引优化

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 name;

    public String qq;

    public ThreadToMysql(String name, String qq) {//构造函数传入要查询姓名和qq

          

        this.name=name;

        this.qq=qq;

    }

      

    public void run() {

         String url = "jdbc:mysql://127.0.0.1/student";

         String name = "com.mysql.jdbc.Driver";

         String user = "root";

         String password = "198712";

        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 entry_form where name='"+name+"' and qq='"+qq+"'";//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 <=200; i++) {

            String name=String.valueOf(i);

            new ThreadToMysql(name, "123456").start();

      

  

         }

    }

}


参考杨舜师兄的办法,name栏位的值改为唯一值。

通过插入UUID实现

package insert;

  

import java.sql.SQLException;

import java.util.UUID;  

  

public class ThreadToMysql {

    public static void main(String[] args) throws SQLException {

        try {

            Class.forName("com.mysql.jdbc.Driver");

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        }

        java.sql.Connection conn = java.sql.DriverManager.getConnection("jdbc:mysql://localhost/student", "root", "198712");

        java.sql.Statement stmt = conn.createStatement();

        int total = 25000;

        System.out.println("====start=====");

        long start = System.currentTimeMillis();

        // 测试插入数据库的功能:

        for (int n = 0; n <8000; n++) {

            StringBuffer sBuffer = new StringBuffer(" insert into entry_form(name) values ");

            for (int i = 0; i < total; i++) {

                String name = UUID.randomUUID().toString();

                if (i == total - 1) {

                    sBuffer.append("('" + name + "');");

                } else {

                    sBuffer.append("('" + name + "'),");

                }

            }

            System.out.println("第" + n + "次插入2.5万条数据!");

            stmt.executeUpdate(sBuffer.toString());

        }

        long end = System.currentTimeMillis();

        System.out.println("run time:" + (end - start)/1000+"秒");

        stmt.close();

        conn.close();

    }

}


插入2亿条数据


对比有无索引select语句效率,质的区别

验收标准

1.DB的设计和命名符号规范

字母大小写等,参考草船云,列出来

2.除了CRUD的基本单元测试,加上根据学员名字,学号去查找报名贴的单元测试

CRUD已经实现,后面的根据学员名字和学号查找报名贴单元测试还没做

3.Java代码符合命名规范

参考草船云,列出来

4.Interface和ServiceImpl分开

任务要求,没问题

5.分别使用Mybatis的配置文件和Annotation方式去配置数据库

mybatis配置数据库没问题,注解法没在jdbc中做

6.使得Log4j来记录日志

maven项目依赖添加log4j模块,pomxml实现。

7.通过远程连接Mysql,使用自定义域名并通过配置本地Host来配置DB连接文件

云服务器mysql配置和数据库导入已完成,自定义域名还没研究

8.添加数据返回ID,删除或更新数据返回True/False

远程数据库操作?这里没有做

9.访问数据的时候使用Try/Catch捕获异常,关闭DB之后测试异常代码可以正确执行

任务要求,已实现

10.关闭连接

trycatch resource功能,自动关闭


困难

随机数据插入的问题,已经找杨舜师兄解决


收获

索引对大规模数据库效率提升

索引选取栏位唯一性高时,数据库操作效率更是质的飞跃

对比师兄代码,自己trycatch异常处理和链接关闭喜欢遗忘


明日计划

对照审核标准,完成遗漏部分

深度思考未完成部分






返回列表 返回列表
评论

    分享到