编写快速MySQL插入查询或优化此查询
我写了一个插入查询。在本地服务器上运行时,没有问题,但在实时服务器上运行相同查询时会显示错误 labtestdat上的总数据-->51439编写快速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')
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+行,如何解决这个问题,请告诉我。。。