发表于: 2018-03-31 22:29:24

3 511



  • 今天完成的事情:

        数据的增删改查、数据库的份与恢复.创建了线下报名系统的基本数据库结构,由于自己将审核人和审核资料分成了两个表,为了方便查询,建立了一个视图  虽然要求对姓名建立索引,但是由于我建立的表审核资料中没有姓名只有学号,虽然有个总的视图,但是网上查了一下在视图上建立索引好像条件很严格而且得不偿失。所以我没有对姓名建立索引而是针对学号和修真类型建立了索引
几个初始数据表:

  • 视图:

  • 明天计划的事情:
  •        JDBC批量向数据库插入数据,创建一个新的Maven项目

    • 遇到的问题:
    •        如何快速向数据库批量插入大量数据,查到了方法一:可以用insert into语句循环插入
    •         
    •       可以使用事务提交,批量插入数据库
    •       
    •        可以使用优化SQL语句:将SQL语句进行拼接,使用 insert into table () values (),(),(),()然后再一次性插入
    •      
    •         虽然网上给出了这三种方法,也说明了各种方法的效率,但是我有点不能理解.为什么方法二和方法三比方法一要速度快.去网上查找了一下原因发现
    •    一条SQL语句插入多条数据较一条一个insert,执行效率高的主要原因是合并后日志量(MySQL的binlog和innodb的事务让日志)减少了,降低日志刷盘的数据量和频率,从而提高效率。通过合并SQL语句,同时也能减少SQL语句解析的次数,减少网络传输的IO。
    •    不使用事务与使用事务相比,使用事务更高是因为进行一个INSERT操作时,mysql内部会建立一个事务,在事务内才进行真正插入处理操作。通过使用事务可以减少创建事务的消耗,所有插入都在执行后才进行提交操作。
    •    由于数据库插入时,需要维护索引数据,无序的记录会增大维护索引的成本。我们可以参照innodb使用的B+Tree 索引,如果每次插入记录都在索引的最后面,索引的定位效率很高,并且对索引调整较小;如果插入的记录在索引中间,需要B+tree进行分裂合并等处理,会消耗比较多计算资源,并且插入记录的索引定位效率会下降,数据量较大时会有频繁的磁盘操作。
    •    SQL语句是有长度限制,在进行数据合并在同一SQL中务必不能超过SQL长度限制,通过max_allowed_packet配置可以修改,默认是1M,测试时修改为8M。事务需要控制大小,事务太大可能会影响执行的效率。MySQL有innodb_log_buffer_size配置项,超过这个值会把innodb的数据刷到磁盘中,这时,效率会有所下降。所以比较好的做法是,在数据达到这个这个值前进行事务提交。
    •    合并数据+事务的方法在较小数据量时,性能提高是很明显的,数据量较大时(1千万以上),性能会急剧下降,这是由于此时数据量超过了innodb_buffer的容量,每次定位索引涉及较多的磁盘读写操作,性能下降较快。而使用合并数据+事务+有序数据的方式在数据量达到千万级以上表现依旧是良好,在数据量较大时,有序数据索引定位较为方便,不需要频繁对磁盘进行读写操作,所以可以维持较高的性能。
    •  
    •           所以批量向数据插入数据时,合并数据是通过减少SQL语句的解析,自带事务是减少mysql内部创建事务的消耗,而有序主要是降低消耗的计算资源.由于网上用的php批量插入,所以我想java应该也可以做到,但是在第一步连接数据库就遇到了问题IDEA自带的Maven下载jar包太慢.
    •  
    • 查到需要更换Maven默认Repository,参考网址https://www.cnblogs.com/phpdragon/p/7216626.html,https://jingyan.baidu.com/article/1876c8524ee0d0890a137646.html
      • 收获:
      •         学到的知识:理解了事务,Maven的作用/配置.
      •         对自己的认识:太容易做东西做一半被别的转移走注意力了.明明是计划把数据库部分搞定,结果做着做着跑到Maven的配置了,计划的任务还是留了个尾巴.


返回列表 返回列表
评论

    分享到