编写快速MySQL INSERT查询或优化此查询

时间:2016-04-10 08:29:23

标签: mysql sql optimization query-optimization

我写了一个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

Live Server

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

运行查询

如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

构造C-u 3 C-x <tab>表现不佳。将其转为NOT IN ( SELECT ... )或使用NOT EXISTS ( SELECT * ... )

答案 1 :(得分:0)

首先,确保testmedical列的id上有索引。它应该是PRIMARY KEY

接下来,听起来labtestdata意味着在labidtestid之间建立了独特的关系。假设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键,不要运行它。

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