请帮助解决以下奇怪的问题。我在内存表中定义了,但是插入600.000行需要13分钟,并导致对磁盘的大量写入。CPU未被充分利用,我有足够的空闲内存。我将max_heap_table_size定义为1GB并重新启动DB。2.我创建该表的目的是:
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;分隔符$$ CREATE generate_data()开始声明I INT默认值0;虽然我< 600001,请将其插入到
data(id、datetime、value、channel)值( i,FROM_UNIXTIME(UNIX_TIMESTAMP('2014-01-01 :00:00‘)+楼层(RAND()*31536000)),圆形(RAND()*100,2),i );设置i=i+ 1;结束时;结束$$
发布于 2019-12-30 12:11:50
查看SHOW PROCESSLIST --进程状态“等待处理程序提交”的时间最多。
如果服务器版本为8,则使用递归CTE:
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+服务器,请使用合成数字表:
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):
发布于 2020-01-03 22:34:48
如果由于未知的原因,表实际上是ENGINE=InnoDB,那么您可以这样加速它:
BEGIN;
CALL generate_data()
COMMIT.如果您有过多的RAM,那么I/O是由交换引起的。要解决这个问题,请提供: RAM大小,运行的其他应用程序,innodb_buffer_pool_size和任何其他您增加的设置。那么我们可以提出建议。
以后…
这种技术无助于性能的提高。
我在MySQL和MariaDB的不同版本中测试了SP --它在8.0中很慢。请向https://bugs.mysql.com提交一份错误报告。
https://dba.stackexchange.com/questions/256461
复制相似问题