我在把插入到桌子上有一些困难。基本上,我运行了insert命令,得到:
“2013年错误代码”:查询期间丢失了与MySQL服务器的连接。
这是我的insert命令:
INSERT IGNORE INTO t1(a_id, b_id, c_id, d_id, e_id)
SELECT t1 a_id, b_id, c_id, d_id, e_id FROM all_data;对于这个问题,我尝试增加连接超时时间。
然而,在那之后,我得到:
超过锁定等待超时;尝试重新启动事务
我试过扼杀所有可能的过程。百无所成。更不用说,如果增加超时时间,那么执行查询所花费的时间可能是执行时间的30倍。
我认为我解决这个问题的方法是尝试一次添加更少的数据。因此,我的问题是如何在多列表中只插入一列?
TL;DR:
问题1:插入命令由于“查询期间失去到MySQL服务器的连接”而失败
我的解决方案:增加连接超时时间.
问题2:插入命令由于“锁定等待超时”而失败。
我的解决方案:杀死过程。之后,尝试一次添加一个列。
我的最后一个问题:如何只将一列从另一表插入到多列表?例如:
INSERT IGNORE INTO t1(a_id, b_id, c_id, d_id, e_id)
SELECT a_id FROM all_data;发布于 2018-05-22 18:46:15
如何在多列表中只插入一列?
很可能长时间的处理和锁定等待超时问题来自于处理太多的行,而不是太多的列。因此,一次做一个列的插入工作并不能解决问题。
您需要一次处理较少的行。在不知道all_data表是否有主键的情况下,很难就此给出具体的建议。但是,假设您有一个名为primary_key_id的主键列,下面是这个过程的概要。
SET @last_id := -1;
INSERT IGNORE INTO t1( a_id, b_id, c_id, d_id, e_id)
SELECT a_id, b_id, c_id, d_id, e_id
FROM all_data
WHERE primary_key_id > @last_id
ORDER BY primary_key_id
LIMIT 1000
SELECT MAX(primary_key_id) INTO @last_id
FROM all_data
WHERE primary_key_id > @last_id
ORDER BY primary_key_id
LIMIT 1000然后重复第二次和第三次查询,直到第二个查询不插入任何行为止。
我已经将1000设置为批处理大小。你可能会使用更大或更小的东西。
如果不能使用主键,可以考虑以其他方式拆分批处理。例如,也许是通过名字的第一个字母。第一批将使用WHERE name LIKE '%A'检索,第二批将由WHERE name LIKE '%B'等检索。你知道你的数据,所以你才是解决分批的人。
发布于 2018-05-22 19:00:12
尝试在插入之前运行此隔离级命令,告诉MySQL在all_data表繁忙时不要等待。
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;https://stackoverflow.com/questions/50474249
复制相似问题