编写快速MySQL插入查询或优化此查询

编写快速MySQL插入查询或优化此查询,mysql,sql,optimization,query-optimization,Mysql,Sql,Optimization,Query Optimization,我写了一个插入查询。在本地服务器上运行时,没有问题,但在实时服务器上运行相同查询时会显示错误 labtestdat上的总数据-->51439 testmedical-->1684上的总数据 本地服务器 插入查询: INSERT INTO labtestdata(labid,testid) SELECT '131',id FROM testmedical WHERE id NOT IN(SELECT testid FROM labtestdata WHERE labid = '131')

我写了一个插入查询。在本地服务器上运行时,没有问题,但在实时服务器上运行相同查询时会显示错误

labtestdat上的总数据-->51439

testmedical
-->1684上的总数据


本地服务器 插入查询:

INSERT INTO labtestdata(labid,testid) SELECT '131',id FROM testmedical 
WHERE id NOT IN(SELECT testid FROM labtestdata WHERE labid = '131') 
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秒。)

计数查询:

SELECT count(id) FROM testmedical WHERE id NOT IN(select testid FROM labtestdata WHERE labid = '131')
SELECT count(id) FROM testmedical WHERE id NOT IN(select testid FROM labtestdata WHERE labid = '131')
确认信息:

您的SQL查询已成功执行

计数(id)
0


实时服务器 插入查询:

INSERT INTO labtestdata(labid,testid) SELECT '131',id FROM testmedical 
WHERE id NOT IN(SELECT testid FROM labtestdata WHERE labid = '131') 
INSERT INTO labtestdata(labid,testid) SELECT '131',id FROM testmedical WHERE id NOT IN(SELECT testid FROM labtestdata WHERE labid = '131') 
确认信息:

#2013-查询期间与MySQL服务器的连接中断

计数查询:

SELECT count(id) FROM testmedical WHERE id NOT IN(select testid FROM labtestdata WHERE labid = '131')
SELECT count(id) FROM testmedical WHERE id NOT IN(select testid FROM labtestdata WHERE labid = '131')
确认信息(20秒后显示):

#2013-查询期间与MySQL服务器的连接中断


注意:查询是使用phpMyAdmin运行的


如何解决此问题?

构造
不在(选择…
中)的性能不好。将其转换为
不存在(选择*…)
或使用
左连接。。。为空

首先,确保您在
testmedical
上为
id
列设置了索引。它可能是
主键

接下来,听起来像是
labtestdata
意味着
labid
testid
之间有一种独特的关系。假设
labid
通常被称为常数,请确保在覆盖
(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
表不是很大,所以希望它能很好地执行。不过,在没有确保您拥有唯一密钥的情况下,不要运行此操作


请注意,可能还有其他因素:如果您的实时环境在这些表上有大量负载或活动,则可能是这些表被锁定,或者此查询加剧了其他性能问题。

请咨询您的服务器管理员。这可能是因为
net\u read\u timeout
服务器变量。通常默认为30秒。但这不是解决方案,现在服务器上只有50000+行,将来只有1000000+行,如何解决这个问题,请告诉我。。。