› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
madaima
V2EX  ›  MySQL

mysql 批量插入数据越来越慢 如何解决?

  •  
  •   madaima · Feb 26, 2018 · 7970 views
    This topic created in 3141 days ago, the information mentioned may be changed or developed.

    表中有两个唯一索引;

    使用 php 对一个数据表进行批量插入时,开始插入 1w 条数据只要 2s,插入 50w 条数据过后,再次插入 1w 条数据需要 18s ;

    sql 使用的是拼接方式,3000 条数据拼接成一条 sql 执行;

    这种问题如何解决?

    18 replies  •  2018-02-26 23:47:55 +08:00
    yidinghe
        1
    yidinghe  
    PRO
       Feb 26, 2018
    首先拼接 SQL 执行并不是真正的批量插入,最好使用标准的批量插入方式;其次,表的索引要尽可能的少,索引越多插入效率越低。
    realpg
        2
    realpg  
       Feb 26, 2018
    igonre delayed 循环插吧 不用拼接成一个
    msg7086
        3
    msg7086  
       Feb 26, 2018
    禁用索引,换 SSD。
    alvinbone88
        4
    alvinbone88  
       Feb 26, 2018   ❤️ 1
    akira
        5
    akira  
       Feb 26, 2018
    把索引删了,数据导完以后再加回来
    male110
        6
    male110  
       Feb 26, 2018
    把索引删了,数据导完以后再加回来
    lastpass
        7
    lastpass  
       Feb 26, 2018
    可以试着先插入到一个空的中间表,再复制到的需要插入的表里。我原来在 oracle 上实验过这种方式最快。MySQL 应该也是同理。
    lianxiaoyi
        8
    lianxiaoyi  
       Feb 26, 2018
    最简单的你可以试试 1 万个一条 SQL。降低内部刷 IO
    est
        9
    est  
       Feb 26, 2018
    把 @alvinbone88 那篇文章一定挨个看完。绝对不会慢。
    fakepoet
        10
    fakepoet  
       Feb 26, 2018
    mysql 的单表 IO 放大问题,如果数据量百万级接近千万,建议分表。
    madaima
        11
    madaima  
    OP
       Feb 26, 2018
    @msg7086 不用索引怎么确定数据唯一呢
    madaima
        12
    madaima  
    OP
       Feb 26, 2018
    @alvinbone88 谢谢,我测试了一下 1000 条数据批量插入时,临时关索引 所消耗的时间基本是 不关索引插入 的一半,但是批量插入 1 万条时 两个方法都超过 30s 了。我在仔细看看文档。
    madaima
        13
    madaima  
    OP
       Feb 26, 2018
    谢谢 各位朋友的指导 我就不一个个 @了
    madaima
        14
    madaima  
    OP
       Feb 26, 2018
    @fakepoet 后期打算分表了。
    madaima
        15
    madaima  
    OP
       Feb 26, 2018
    @lianxiaoyi 1 万条数据拼接成的 sql 字符串长度会超过 mysql 限制的 65535 个字符长度,虽然能修改配置,但是不方便。
    beginor
        16
    beginor  
       Feb 26, 2018 via Android
    分表会增加不少逻辑,如果能做表分区的话最好了
    runntuu
        17
    runntuu  
       Feb 26, 2018 via iPhone   ❤️ 1
    看一下执行时间都花在哪了,
    https://www.cnblogs.com/happySmily/p/5943311.html
    opengps
        18
    opengps  
       Feb 26, 2018 via Android
    看下你的聚集索引是什么字段,尽量采用时间等字段当聚集索引,这样追加数据物理上是尾部追加,而不是中间填充。数据量大了相差很明显,我曾做过实验,10 亿都没问题
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2332 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 56ms · UTC 09:25 · PVG 17:25 · LAX 02:25 · JFK 05:25
    ♥ Do have faith in what you're doing.