首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL8.0内存表慢插入

MySQL8.0内存表慢插入
EN

Database Administration用户
提问于 2019-12-30 10:46:49
回答 2查看 609关注 0票数 0

请帮助解决以下奇怪的问题。我在内存表中定义了,但是插入600.000行需要13分钟,并导致对磁盘的大量写入。CPU未被充分利用,我有足够的空闲内存。我将max_heap_table_size定义为1GB并重新启动DB。2.我创建该表的目的是:

代码语言:javascript
复制
CREATE TABLE `data`
     (
       `id`         bigint(20)       DEFAULT NULL,
       `datetime`   timestamp        DEFAULT CURRENT_TIMESTAMP,
       `channel`    int(11)          DEFAULT NULL,
       `value`      bigint(20)       DEFAULT NULL
     ) ENGINE = MEMORY;
  1. 我创建了插入数据的过程。

分隔符$$ CREATE generate_data()开始声明I INT默认值0;虽然我< 600001,请将其插入到data (iddatetimevaluechannel)值( i,FROM_UNIXTIME(UNIX_TIMESTAMP('2014-01-01 :00:00‘)+楼层(RAND()*31536000)),圆形(RAND()*100,2),i );设置i=i+ 1;结束时;结束$$

EN

回答 2

Database Administration用户

发布于 2019-12-30 12:11:50

查看SHOW PROCESSLIST --进程状态“等待处理程序提交”的时间最多。

如果服务器版本为8,则使用递归CTE:

代码语言:javascript
复制
INSERT INTO `data` (`id`, `datetime`,`value`,`channel`)
WITH recursive 
cte AS (select 1 i
        union all
        select i+1 from cte where i <= 600000)
select i, 
       FROM_UNIXTIME(UNIX_TIMESTAMP('2014-01-01 01:00:00')+FLOOR(RAND()*31536000)),
       ROUND(RAND()*100,2),
       i
FROM cte;

如果您有5+服务器,请使用合成数字表:

代码语言:javascript
复制
INSERT INTO `data` (`id`, `datetime`,`value`,`channel`)
select i, 
       FROM_UNIXTIME(UNIX_TIMESTAMP('2014-01-01 01:00:00')+FLOOR(RAND()*31536000)),
       ROUND(RAND()*100,2),
       i
FROM (  SELECT 1+d1.num+d2.num*10+d3.num*100+d4.num*1000+d5.num*10000+d6.num*100000 i
        FROM (SELECT 0 num UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) d1,
             (SELECT 0 num UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) d2,
             (SELECT 0 num UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) d3,
             (SELECT 0 num UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) d4,
             (SELECT 0 num UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) d5,
             (SELECT 0 num UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) d6
      ) d0;

在同一系统中(服务器版本8.0.18):

  • 你的手术-超过20分钟。(5分钟后死亡,插入122 K记录)
  • 插入CTE-3.10秒。
  • 插入合成器。表- 4.08秒。
票数 2
EN

Database Administration用户

发布于 2020-01-03 22:34:48

如果由于未知的原因,表实际上是ENGINE=InnoDB,那么您可以这样加速它:

代码语言:javascript
复制
BEGIN;
CALL generate_data()
COMMIT.

如果您有过多的RAM,那么I/O是由交换引起的。要解决这个问题,请提供: RAM大小,运行的其他应用程序,innodb_buffer_pool_size和任何其他您增加的设置。那么我们可以提出建议。

以后…

这种技术无助于性能的提高。

我在MySQL和MariaDB的不同版本中测试了SP --它在8.0中很慢。请向https://bugs.mysql.com提交一份错误报告。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/256461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档