我无法弄清楚'为什么要按顺序排列'下面的Query2中的子句导致它占用一分钟,而第一个子句立即返回结果。是否有更好的方法来执行此操作'按顺序排列
快速:
select c.id, max(date(a.sent)) as sent,
if(c.id in (select id from bin where (num=1 or num=2)),1,0) as done
from test c, test2 a
where c.id=a.id
group by c.id
limit 1;
慢
select c.id, max(date(a.sent)) as sent,
if(c.id in (select id from bin where (num=1 or num=2)),1,0) as done
from test c, test2 a
where c.id=a.id
group by c.id
order by done, sent
limit 1;
答案 0 :(得分:1)
这是因为order by子句中的“columns”不是真正的列,而是查询中其他位置的计算的别名。因此,它们没有编入索引,服务器必须在运行中对它们进行排序。使用连接来计算已完成而不是子查询,可能会加快这一速度。
答案 1 :(得分:0)
如果要恢复所有记录,则排序不应花费太多时间,即使它们是计算/非索引字段。但是,您使用的是“限制1”。这改变了优化器的方法。
在第一种情况下,您按ID排序。由于您具有“限制1”并且ID可能具有索引,因此优化程序可以通过ID获取ID,并且当它获得与WHERE子句匹配的一条记录时,它可以返回。
但是,在第二个查询中,即使您只想要1个记录,优化器也不会知道哪个记录将被计算,除非它计算整个集合(就好像您没有“限制1”)然后只返回第一个。
取下“LIMIT 1”并比较两个查询。如果差异仍然存在,则可能是另一个问题。
很难说什么最适合您的音量。试试这个问题:
select id, max(date(sent)) as sent, 0 As done
from test2
where exists (select 1 from bin where bin.id=test2.id and num not in (1,2))
group by id
union all
select id, max(date(sent)) as sent, 1 As done
from test2
where exists (select 1 from bin where bin.id=test2.id and num in (1,2))
group by id
order by done, sent
limit 1
SQL Fiddle is here如果你想调整它。
我遗漏了测试表,因为你没有带回除ID之外的任何字段,这已经在test2上了。如果你需要测试的其他字段,你将不得不调整它。