同样的代码、同样的数据、同一台的机器
批量插入 860W 行数据
MySQL8.0 只有 600 行 /s
MySQL5.7 轻松破 7K 行 /s
都是 MyISAM 引擎
8.0 是需要什么特殊的优化技巧吗?
1
epicq OP 我注意到 8.0 的硬盘占用达到 80%,5.7 只有 1%
这是为什么? |
2
RedisMasterNode 2020-02-27 00:23:27 +08:00
可以给出具体代码和环境吗
|
3
RedisMasterNode 2020-02-27 00:23:44 +08:00
另外为什么还在用 MyISAM 引擎可以说下理由?
|
4
epicq OP @RedisMasterNode 因为 InnoDB 更慢,而且没有事务需求。只是解析一个 2.66G 大小的 json 文件,大约 860W 行,准备作为机器学习的数据集来用。
|
5
est 2020-02-27 00:38:35 +08:00
> 都是 MyISAM 引擎
InnoDB 可以插入玩了再开事务。 |
6
mazyi 2020-02-27 00:46:20 +08:00
硬盘是一直高还是插的时候才高
|
9
epicq OP 我测试了一下
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??? |
10
epicq OP 5.7 的 MyISAM 磁盘占用真的只有 1%,不是我打漏了,而且插入性能是其他 10 倍以上,WHY ???
|
11
lijialong1313 2020-02-27 02:00:40 +08:00
会不会是你使用的库的原因。
试一下插入做成一个事务看是否还有显著差异…… |
12
stabc 2020-02-27 02:29:34 +08:00
应该是 8 出于安全考虑默认开启了 WAL,也就是每条插入确认硬盘写入了 LOG 之后才开始下一条插入,这样保证了断电不丢失数据。 你 600/s 算是硬盘性能不错的了。查查手册把 WAL 关了就快了。
|
13
leviathan0992 2020-02-27 06:05:41 +08:00
配置一样不一样啊?
|
14
freelancher 2020-02-27 07:34:35 +08:00
那为什么不直接用。MYSQL 7?
|
15
luckylo 2020-02-27 07:55:21 +08:00 via Android
@freelancher 他要操作 json。对 json 的支持 8 要好一点。
换句话说,你不用事务,mongodb 不香么?手动狗头 |
16
xiaoyanbot 2020-02-27 07:56:33 +08:00
@freelancher 什么鬼,哪有 mysql 7 呀
|
17
xiaoyanbot 2020-02-27 07:56:51 +08:00
MyISAM 引擎,mysql 8 还支持?
|
18
iConnect 2020-02-27 08:02:51 +08:00 via Android
你机器什么配置?我看有没有接近的机器测一下
|
19
y0bcn 2020-02-27 08:21:17 +08:00
开启事务,会快很多。
当年做的一个小项目,刚开始学不懂,导入 excel 中的数据,要一分钟左右,慢的怀疑人生,开启事务之后只需要一秒左右完成了。 |
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 完全不在一个档次。 |
22
nozer 2020-02-27 09:21:58 +08:00
是 load data,写错了。
|
23
FaceBug 2020-02-27 09:41:18 +08:00
bin_log 都关了吗
|
24
a719114136 2020-02-27 11:00:29 +08:00
有可能是 bin log 的关系,5.7 默认关闭 bin log 的。
另外和运行环境也有关系,mac 上使用 docker 的话会和 linux 上的性能有差距。 |
25
yafoo 2020-02-27 11:00:35 +08:00 via Android
一直以为开启事物会变慢,原来会变快
|
26
wps353 2020-02-27 11:03:00 +08:00
主要的配置参数一样吗?
|
27
littlewing 2020-02-27 11:04:43 +08:00
条件不足,无法判断
确定所有参数都一样? |
28
Maboroshii 2020-02-27 11:06:22 +08:00 via Android
关注一下
|
29
nikoo 2020-02-27 11:16:52 +08:00
|
30
epicq OP @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% |
32
epicq OP |
34
yanyueio 2020-02-27 16:06:39 +08:00
bin log 关闭了还是一样的结果,那会不会是因为 5.7 是批处理插入的? 而 8.0 则没有?
需要查询相关操作 log 来排查看看。 |
35
epicq OP @nozer 我其实把这个数据保存进数据库就是为了筛选一下然后存成 csv...你要我先处理成 csv 再保存到数据库,我宁愿等 4 个小时。而且目前 5.7 的 MyISAM 插入 860W 行只要 1100 秒左右,我的需求已经解决了,我只是惊讶于为什么性能差距这么大
|
36
LeeSeoung 2020-02-27 16:44:34 +08:00
楼主解决了记得回头分享下原因
|
37
pinews 2020-02-27 17:33:25 +08:00
据说 5.7 好比小汽车,8.0 好比火车,你是不是把火车当汽车用了?
|
38
imycc 2020-02-28 01:23:50 +08:00
之前处理过 5.5 升级到 5.7 的事情,还没用上 8。
我怀疑是配置不一致导致的。你可以查一下 MySQL8.0 的官方升级文档,然后对照着自己的 5.7 的配置,看一下哪些选项在新版本中被禁用了。还可以考虑下是不是以前 5.7 配置了什么优化项,没有配到 8.0 上。 |
39
freelancher 2020-02-28 16:16:06 +08:00
O 了。我没有去跟后面的 MYSQL 版本了。工具是要自己用的。你解决不了问题,那你就试着换一个工具呀。
|
42
Aresxue 2020-03-01 17:57:29 +08:00
很奇怪的现象。执行语句的客户端是哪个? Navicat ? DataGrip?PLSQL ?
|
43
Aresxue 2020-03-01 17:58:40 +08:00
顺便用抓包工具看一下 tcp 连接数还有数据包的大小
|