制作像这样的子查询有困难:
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万条记录。
有什么办法优化这个?谢谢。
答案 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);