V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
caiji11
V2EX  ›  Java

加快 mysql 插入速度有哪些方式呢

  •  
  •   caiji11 · 2020-12-19 21:21:59 +08:00 · 3052 次点击
    这是一个创建于 1413 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 最近用 java 做了一个小工具 可以向 mysql 插入大量插入随机数据 可是效率有点低
      之前想过生成随机数据后 写到 txt 文本 再读到 数据库 但这需要 mysql 开启读文本的权限
      想知道有其他方式优化插入速度么
    28 条回复    2020-12-22 15:27:32 +08:00
    xuanbg
        1
    xuanbg  
       2020-12-19 21:26:40 +08:00
    楼主批量插入了解一下
    LGA1150
        2
    LGA1150  
       2020-12-19 21:51:00 +08:00
    是自增主键吗?
    caiji11
        3
    caiji11  
    OP
       2020-12-19 22:06:07 +08:00
    @LGA1150 对的 有啥好的想法么
    caiji11
        4
    caiji11  
    OP
       2020-12-19 22:08:17 +08:00
    @xuanbg 这样 value 后面拼接太多的话 也需要 去设置下 mysql 感觉别人用了工具 可能不知道要设置
    clrss
        5
    clrss  
       2020-12-19 22:41:10 +08:00
    server 端 prepare stmt 用了么
    ericbize
        6
    ericbize  
       2020-12-19 22:52:59 +08:00 via iPhone
    lz 是单次插入单条吗?
    ZXCDFGTYU
        7
    ZXCDFGTYU  
       2020-12-19 22:58:17 +08:00   ❤️ 1
    数据如果不重要的话可以把表结构设计为 memory,然后 insert 的时候,可以拼接多个 value,但是不要拼接太多
    johnsona
        8
    johnsona  
       2020-12-19 22:59:59 +08:00
    九浅一深
    opengps
        9
    opengps  
       2020-12-19 23:09:26 +08:00
    机械硬盘的话,换成 ssd 硬盘
    单条单次写入的话,改为多次批量写入
    写入随机时候,保持聚集索引列是递增状态的
    wellsc
        10
    wellsc  
       2020-12-19 23:11:58 +08:00
    换 myrocks 引擎,插入贼快,查找就有点捉急
    limuyan44
        11
    limuyan44  
       2020-12-19 23:26:18 +08:00
    只是生成随机数据还有比存储过程快的吗
    caiji11
        12
    caiji11  
    OP
       2020-12-19 23:53:04 +08:00
    @clrss 没有 这个对 效率影响很大么 用 jdbc 简单的 insert 不过 刚才试了下批量插入 作用好像不是很明显
    wowo243
        13
    wowo243  
       2020-12-19 23:55:15 +08:00 via Android
    @caiji11 好像连接的 jdbc url 里要加个配置,批量插曲是比单条快不少的
    caiji11
        14
    caiji11  
    OP
       2020-12-19 23:55:43 +08:00
    @opengps 嗯嗯 自己可以这么做 我想做成开源的工具
    caiji11
        15
    caiji11  
    OP
       2020-12-20 00:04:16 +08:00
    @wowo243 rewriteBatchedStatements=true 这个吧 有点作用 快了三秒
    caiji11
        16
    caiji11  
    OP
       2020-12-20 00:06:06 +08:00
    @wellsc 谢谢啦 知道个新的引擎 不过我想做成开源的工具 想从 sql 入手
    caiji11
        17
    caiji11  
    OP
       2020-12-20 00:06:33 +08:00
    @ericbize 已经改成了拼接的方式
    caiji11
        18
    caiji11  
    OP
       2020-12-20 00:07:25 +08:00
    @limuyan44 没懂啥意思 可以再说下么
    ericls
        19
    ericls  
       2020-12-20 00:11:53 +08:00 via iPhone
    去掉 constraint 和 index
    foam
        20
    foam  
       2020-12-20 01:00:43 +08:00 via Android   ❤️ 1
    @caiji11 他的意思是,你直接在存储过程里写随机值插数据。我没用过,对该方法不表态。

    另外,如果用的是 inodb,插入前可以将 innodb_flush_log_at_trx_commit 设置为 0,保证最快插入,处理完再设置回去(默认值是 1)。该参数为 0 时表示每次事务(注意每次插入就是一次事务的提交)写到 buffer 后就返回了,会有个线程异步去刷到日志和落磁盘。而 1 则落到磁盘才返回。
    haosamax
        21
    haosamax  
       2020-12-20 15:27:20 +08:00 via iPhone
    change buffer
    OldCarMan
        22
    OldCarMan  
       2020-12-20 17:40:17 +08:00
    @caiji11 个人猜测 楼上说的存储过程应该是类似这个( https://zhuanlan.zhihu.com/p/62626328 )的意思,不知道是不是你想要的。另外,自增主键存储过程中可以用 AUTO_INCREMENT,其他字段也想自增的话,可以使用序列。
    YouLMAO
        23
    YouLMAO  
       2020-12-20 22:30:31 +08:00 via Android
    购买 spanner, 全球三地三中心三活
    caiji11
        24
    caiji11  
    OP
       2020-12-21 19:21:02 +08:00
    @OldCarMan 我不是这样的 我用 java 做好逻辑判断之后拼接存入 因为日期处理 有点复杂 不过我发我的逻辑代码运行时间过长 也是问题
    OldCarMan
        25
    OldCarMan  
       2020-12-21 21:37:20 +08:00
    @caiji11 我好奇,你用 java 这种方式批量导入随机数据的耗时是怎么样,我用我上面贴的例子,批量导入 20 万条(表结构 user(id,name,age))数据到我电脑虚拟机 mysql 容器花了 44 秒左右。
    caiji11
        26
    caiji11  
    OP
       2020-12-21 22:24:08 +08:00
    @OldCarMan 很慢的 没有这么快 逻辑处理要耗费很多时间 做到可以自定义日期范围 以及一个表中几个日期之间的关系 如果没有自定义生成的话 出来的数据也不能用 主要考虑到这 所以没有用存储过程 用 go 会不会快些呢 哈哈
    caiji11
        27
    caiji11  
    OP
       2020-12-21 22:26:57 +08:00
    @OldCarMan https://github.com/fcdml/MOCKSQL 工具地址 可以看看具体的实现
    OldCarMan
        28
    OldCarMan  
       2020-12-22 15:27:32 +08:00
    @caiji11 嗯嗯,不过个人觉得如果只是想控制时间的范围,用存储过程也是可以实现的。比如使用 mysql 自带函数 DATE_ADD(date,INTERVAL expr type)之类的结合随机数函数生成一定范围的随机时间。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2744 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 14:27 · PVG 22:27 · LAX 07:27 · JFK 10:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.