【发布时间】:2022-12-09 12:05:05
【问题描述】:
我在 ubuntu 服务器(20.04 lts)上使用 MySQL 作为官方 docker 镜像(Ver 8.0.27)。
由于扩展存储,我重新安装了服务器。
MySQL和ubuntu服务器的版本是一样的。
但是,MySQL 的性能相当下降。
我正在尝试收集 Ehtereum(这是一种加密货币。)网络的地址。
收集的方法很简单。
- 获取交易信息。
- 提取地址(收件人和发件人)。
- 如果地址已经记录在MySQL表中,则忽略它。如果没有记录地址,则记录地址。
- 获取下一个交易信息。
- 回到2。
我通过使用 Typescript 中的程序(使用 Node.js、mysql2 和 Web3.js)执行上述循环。
关于上面列表中第3项的if语句,我使用的是MySQL的唯一约束,而不是Typescript。简而言之,首先,制作如下表格,
CREATE TABLE `addressList` ( `timestampReadable` varchar(32) DEFAULT NULL, `timestamp` int DEFAULT NULL, `showUpBlock` int DEFAULT NULL, `firstTransactionHash` varchar(66) DEFAULT NULL, `address` varchar(42) DEFAULT NULL, UNIQUE KEY `addressList_address_uindex` (`address`), KEY `addressList2_timestamp_index` (`timestamp`), KEY `addressList2_firstTransactionHash_index` (`firstTransactionHash`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci并且,在程序中,只运行以下查询。
INSERT INTO addressList values (123456, 123456, 123456, 'hfuwheohg', 'jhfoiehhfs');如果地址唯一,则记录地址,如果地址不唯一,则不记录地址。
当前的记录数量约为 160,000,000~。
这可能是一个大表,但程序在重新安装之前以实际性能运行。所以,我找不到问题的原因。
为了以防万一,我运行了check table,结果如下图好像没问题。Table Op Msg_type Msg_text ethereum.addressList check status OK 我尝试设置一些 MySQL 配置,如下所示。
SET GLOBAL max_connections=1500; SET GLOBAL sort_buffer_size=1024 * 1024 * 1024;但是,性能并没有提高。
第一次启动时忘记了MySQL的配置(真后悔)。有谁知道如何处理它? 请帮我!
【问题讨论】:
-
您是否尝试过使用 manpages.ubuntu.com/manpages/xenial/man1/mysqltuner.1.html mysql tuner for ubuntu?系统运行一两天后打开的最大连接数是多少?新存储有可能相当慢吗?
-
试试设置
Set Global innodb_flush_log_at_trx_commit=2看看写入速度有没有变化。但是,如果这是需要的,它将不符合 ACID。我认为您将soft_buffer_size和最大连接数设置得太高。总体内存分配是连接数 X 排序缓冲区大小的倍数,加上一些其他缓冲区。由于您只是将更多内容写入 DB,因此软缓冲区可以很小,例如 4K。 -
请参阅 insert ignore 而不是在应用程序代码中进行检查。还可以考虑将
address设为主键和/或NOT NULL。大号innodb_buffer_pool_size和innodb_log_file_size会有所帮助。如果你有容器日志,一些系统配置可能在日志中。
标签: mysql node.js docker ethereum ubuntu-server