我写了一个INSERT查询。在本地服务器上运行时,没有问题,但在实时服务器上运行相同的查询时显示错误。
labtestdat
上的总数据 - > 51439
testmedical
上的总数据 - > 1684
INSERT查询:
INSERT INTO labtestdata(labid,testid) SELECT '131',id FROM testmedical
WHERE id NOT IN(SELECT testid FROM labtestdata WHERE labid = '131')
确认消息:
插入了1684行。 插入的行ID:67592(查询耗时0.0318秒。)
COUNT个查询:
SELECT count(id) FROM testmedical WHERE id NOT IN(select testid FROM labtestdata WHERE labid = '131')
确认消息:
您的SQL查询已成功执行。
计数(ID)
0
INSERT查询:
INSERT INTO labtestdata(labid,testid) SELECT '131',id FROM testmedical WHERE id NOT IN(SELECT testid FROM labtestdata WHERE labid = '131')
确认消息:
#2013 - 查询期间与MySQL服务器的连接丢失
COUNT个查询:
SELECT count(id) FROM testmedical WHERE id NOT IN(select testid FROM labtestdata WHERE labid = '131')
确认消息(20秒后显示):
#2013 - 查询期间与MySQL服务器的连接丢失
注意:使用phpMyAdmin
运行查询如何解决这个问题?
答案 0 :(得分:0)
构造C-u 3 C-x <tab>
表现不佳。将其转为NOT IN ( SELECT ... )
或使用NOT EXISTS ( SELECT * ... )
。
答案 1 :(得分:0)
首先,确保testmedical
列的id
上有索引。它应该是PRIMARY KEY
。
接下来,听起来labtestdata
意味着在labid
和testid
之间建立了独特的关系。假设labid
通常被称为常量,请确保您在UNIQUE
的表格中有一个(labid, testid)
键。
我假设这些列都是整数(或smallint等)类型。如果他们被定义为text或varchar,那也可能会损害性能。
如果查询在确保您拥有这些索引后仍然很慢,请尝试完全避免使用WHERE:
INSERT INTO labtestdata
(labid, testid)
SELECT '131', id
FROM testmedical
ORDER BY id
ON DUPLICATE KEY UPDATE
id = VALUES(id);
由于testmedical
表不是很大,所以希望这表现不错。但是,不要确保你有UNIQUE键,不要运行它。
请注意,可能还有其他因素:如果您的实时环境在这些表上有很多负载或活动,可能它们被锁定,或者此查询会加剧其他性能问题。