子查询返回数千行,导致缓慢

时间:2016-10-02 01:34:12

标签: mysql

制作像这样的子查询有困难:

SELECT ser_id FROM service 
WHERE ser_id NOT IN 
    (SELECT ser_id FROM history WHERE his_status=2)

延迟时间为4秒。

如果我只运行子查询:

SELECT ser_id FROM history WHERE his_status=2

只需0.5秒即可完成。 这个子查询有5万条记录。

有什么办法优化这个?谢谢。

2 个答案:

答案 0 :(得分:2)

请尝试使用NOT EXISTS。这可以在处理" large"时加快查询速度。子查询本身内选取的行数:

SELECT s.ser_id
FROM service s
WHERE NOT EXISTS (
  SELECT 1
  FROM history h
  WHERE h.his_status = 2
    AND h.ser_id = s.ser_id
  )

尝试EXPLAIN计划,看看真正的区别。

答案 1 :(得分:0)

首先,您必须创建索引。

CREATE INDEX ser_id__index ON service (ser_id);
CREATE INDEX his_status__index ON history (his_status);

然后比较这两个sql

第一

SELECT ser_id FROM service 
WHERE ser_id NOT IN 
    (SELECT ser_id FROM history WHERE his_status=2);

第二

SELECT ser_id FROM service 
WHERE ser_id NOT IN 
    (SELECT DISTINCT ser_id FROM history WHERE his_status=2);    
相关问题