V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
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
epicq
V2EX  ›  MySQL

为什么 MySQL8.0 比 MySQL5.7 的插入性能差了这么多?

  •  
  •   epicq · 2020-02-27 00:12:23 +08:00 · 10921 次点击
    这是一个创建于 1765 天前的主题,其中的信息可能已经有所发展或是发生改变。

    同样的代码、同样的数据、同一台的机器

    批量插入 860W 行数据

    MySQL8.0 只有 600 行 /s

    MySQL5.7 轻松破 7K 行 /s

    都是 MyISAM 引擎

    8.0 是需要什么特殊的优化技巧吗?

    第 1 条附言  ·  2020-02-27 16:09:49 +08:00
    MySQL5.7:
    InnoDB_CPU15~30%_磁盘 85%_插入 600 行 /s
    MyISAM_CPU45~60%_磁盘 1%_插入 8k 行 /s (你没看错,磁盘只有 1%,而且性能最好)

    MySQL8.0:
    InnoDB_CPU15~29%_磁盘 88%_插入 300 行 /s
    MyISAM_CPU15~38%_磁盘 83%_插入 600 行 /s
    43 条回复    2020-03-01 17:58:40 +08:00
    epicq
        1
    epicq  
    OP
       2020-02-27 00:17:41 +08:00
    我注意到 8.0 的硬盘占用达到 80%,5.7 只有 1%

    这是为什么?
    RedisMasterNode
        2
    RedisMasterNode  
       2020-02-27 00:23:27 +08:00
    可以给出具体代码和环境吗
    RedisMasterNode
        3
    RedisMasterNode  
       2020-02-27 00:23:44 +08:00
    另外为什么还在用 MyISAM 引擎可以说下理由?
    epicq
        4
    epicq  
    OP
       2020-02-27 00:27:37 +08:00
    @RedisMasterNode 因为 InnoDB 更慢,而且没有事务需求。只是解析一个 2.66G 大小的 json 文件,大约 860W 行,准备作为机器学习的数据集来用。
    est
        5
    est  
       2020-02-27 00:38:35 +08:00
    > 都是 MyISAM 引擎

    InnoDB 可以插入玩了再开事务。
    mazyi
        6
    mazyi  
       2020-02-27 00:46:20 +08:00
    硬盘是一直高还是插的时候才高
    epicq
        7
    epicq  
    OP
       2020-02-27 01:15:58 +08:00
    @est 主要是我用不到事务,而且我这个需求 InnoDB 确实比 MyISAM 慢啊,难道我的理解或者用法出现了偏差?
    epicq
        8
    epicq  
    OP
       2020-02-27 01:16:27 +08:00
    @mazyi 插入的时候才高
    epicq
        9
    epicq  
    OP
       2020-02-27 01:26:56 +08:00
    我测试了一下

    MySQL5.7:InnoDB_CPU15~30%_磁盘 85%_插入 600 行 /s
    MyISAM_CPU45~60%_磁盘 1%_插入 8k 行 /s

    MySQL8.0:InnoDB_CPU15~29%_磁盘 88%_插入 300 行 /s
    MyISAM_CPU15~38%_磁盘 83%_插入 600 行 /s

    WHY???
    epicq
        10
    epicq  
    OP
       2020-02-27 01:28:46 +08:00
    5.7 的 MyISAM 磁盘占用真的只有 1%,不是我打漏了,而且插入性能是其他 10 倍以上,WHY ???
    lijialong1313
        11
    lijialong1313  
       2020-02-27 02:00:40 +08:00
    会不会是你使用的库的原因。
    试一下插入做成一个事务看是否还有显著差异……
    stabc
        12
    stabc  
       2020-02-27 02:29:34 +08:00
    应该是 8 出于安全考虑默认开启了 WAL,也就是每条插入确认硬盘写入了 LOG 之后才开始下一条插入,这样保证了断电不丢失数据。 你 600/s 算是硬盘性能不错的了。查查手册把 WAL 关了就快了。
    leviathan0992
        13
    leviathan0992  
       2020-02-27 06:05:41 +08:00
    配置一样不一样啊?
    freelancher
        14
    freelancher  
       2020-02-27 07:34:35 +08:00
    那为什么不直接用。MYSQL 7?
    luckylo
        15
    luckylo  
       2020-02-27 07:55:21 +08:00 via Android
    @freelancher 他要操作 json。对 json 的支持 8 要好一点。
    换句话说,你不用事务,mongodb 不香么?手动狗头
    xiaoyanbot
        16
    xiaoyanbot  
       2020-02-27 07:56:33 +08:00
    @freelancher 什么鬼,哪有 mysql 7 呀
    xiaoyanbot
        17
    xiaoyanbot  
       2020-02-27 07:56:51 +08:00
    MyISAM 引擎,mysql 8 还支持?
    iConnect
        18
    iConnect  
       2020-02-27 08:02:51 +08:00 via Android
    你机器什么配置?我看有没有接近的机器测一下
    y0bcn
        19
    y0bcn  
       2020-02-27 08:21:17 +08:00
    开启事务,会快很多。

    当年做的一个小项目,刚开始学不懂,导入 excel 中的数据,要一分钟左右,慢的怀疑人生,开启事务之后只需要一秒左右完成了。
    enlight
        20
    enlight  
       2020-02-27 08:53:59 +08:00
    @luckylo MongoDB 不太香,性能照 PostgreSQL 差不少啊
    nozer
        21
    nozer  
       2020-02-27 09:17:19 +08:00
    如果你要批量导入数据的话,不建议使用 insert 的方式。
    采用 load into 的方式可以更快的导入数据,而且通过 load into 的方式,即使使用 InnoDB 引擎,并开启事务也可以很快的导入数据。
    具体用法你可以查阅官方手册: https://dev.mysql.com/doc/refman/8.0/en/load-data.html

    具体来说,你需要先将数据生成为一份简单格式的本地文件,比如 csv 之类的。
    然后对该文件执行 load into 操作。

    性能跟 insert 完全不在一个档次。
    nozer
        22
    nozer  
       2020-02-27 09:21:58 +08:00
    是 load data,写错了。
    FaceBug
        23
    FaceBug  
       2020-02-27 09:41:18 +08:00
    bin_log 都关了吗
    a719114136
        24
    a719114136  
       2020-02-27 11:00:29 +08:00
    有可能是 bin log 的关系,5.7 默认关闭 bin log 的。

    另外和运行环境也有关系,mac 上使用 docker 的话会和 linux 上的性能有差距。
    yafoo
        25
    yafoo  
       2020-02-27 11:00:35 +08:00 via Android
    一直以为开启事物会变慢,原来会变快
    wps353
        26
    wps353  
       2020-02-27 11:03:00 +08:00
    主要的配置参数一样吗?
    littlewing
        27
    littlewing  
       2020-02-27 11:04:43 +08:00
    条件不足,无法判断

    确定所有参数都一样?
    Maboroshii
        28
    Maboroshii  
       2020-02-27 11:06:22 +08:00 via Android
    关注一下
    nikoo
        29
    nikoo  
       2020-02-27 11:16:52 +08:00
    @epicq 在 mysql8 my.cnf 的 [mysqld] 下增加:
    [mysqld]
    skip-log-bin

    重启后再测一下看看?测试结果 @我下
    epicq
        30
    epicq  
    OP
       2020-02-27 15:46:34 +08:00
    @nikoo
    我试了下
    在 my.ini 的[mysqld]下添加 skip-log-bin 后,show variables like 'log_bin'的值还是 ON
    不过在 my.ini 的最后一行,加入 skip-log-bin 后,'log_bin'的值变成了 OFF
    重启之后再测,MySQL8.0 下 InnoDB 还是只有 600 行 /s,磁盘占用依旧 85%
    epicq
        31
    epicq  
    OP
       2020-02-27 15:49:21 +08:00
    @iConnect surface pro 6,i5-8250u_8G 内存_128G 固态
    epicq
        32
    epicq  
    OP
       2020-02-27 16:01:41 +08:00
    @leviathan0992
    @cepczkd
    @a719114136
    @wps353
    @littlewing

    my.ini 的配置都是各自版本默认的
    加了 skip-log-bin,性能还是很烂
    TangMonk
        33
    TangMonk  
       2020-02-27 16:04:25 +08:00
    @enlight #20 MongoDB 就是辣鸡
    yanyueio
        34
    yanyueio  
       2020-02-27 16:06:39 +08:00
    bin log 关闭了还是一样的结果,那会不会是因为 5.7 是批处理插入的? 而 8.0 则没有?

    需要查询相关操作 log 来排查看看。
    epicq
        35
    epicq  
    OP
       2020-02-27 16:08:19 +08:00
    @nozer 我其实把这个数据保存进数据库就是为了筛选一下然后存成 csv...你要我先处理成 csv 再保存到数据库,我宁愿等 4 个小时。而且目前 5.7 的 MyISAM 插入 860W 行只要 1100 秒左右,我的需求已经解决了,我只是惊讶于为什么性能差距这么大
    LeeSeoung
        36
    LeeSeoung  
       2020-02-27 16:44:34 +08:00
    楼主解决了记得回头分享下原因
    pinews
        37
    pinews  
       2020-02-27 17:33:25 +08:00
    据说 5.7 好比小汽车,8.0 好比火车,你是不是把火车当汽车用了?
    imycc
        38
    imycc  
       2020-02-28 01:23:50 +08:00
    之前处理过 5.5 升级到 5.7 的事情,还没用上 8。

    我怀疑是配置不一致导致的。你可以查一下 MySQL8.0 的官方升级文档,然后对照着自己的 5.7 的配置,看一下哪些选项在新版本中被禁用了。还可以考虑下是不是以前 5.7 配置了什么优化项,没有配到 8.0 上。
    freelancher
        39
    freelancher  
       2020-02-28 16:16:06 +08:00
    O 了。我没有去跟后面的 MYSQL 版本了。工具是要自己用的。你解决不了问题,那你就试着换一个工具呀。
    epicq
        40
    epicq  
    OP
       2020-02-29 15:08:39 +08:00
    @imycc 我不是升级,我是两个都装了,各自默认的 my.ini 配置,分别测试出来的结果
    epicq
        41
    epicq  
    OP
       2020-02-29 15:09:50 +08:00
    @pinews 你可以举例说明一下这两个的差异吗?我是用的默认 my.ini ,我比较惊讶于这么大的性能差距
    Aresxue
        42
    Aresxue  
       2020-03-01 17:57:29 +08:00
    很奇怪的现象。执行语句的客户端是哪个? Navicat ? DataGrip?PLSQL ?
    Aresxue
        43
    Aresxue  
       2020-03-01 17:58:40 +08:00
    顺便用抓包工具看一下 tcp 连接数还有数据包的大小
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2721 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 12:18 · PVG 20:18 · LAX 04:18 · JFK 07:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.