1

我们有一张桌子:

create table ducks (id int(8) primary key not null auto_increment,
                    name varchar(255),
                    car varchar(255), 
                    money int(8)
                   );
insert into ducks set name='donald', car='none', money=10;
insert into ducks set name='scrudge', car='bip', money=10000;
insert into ducks set name='mac', car='bip', money=1000;
insert into ducks set name='joe', car='boo', money=2000000;

因此,对此进行分析后,我发现我们对以下请求的查询速度很慢:

select name,money from ducks where car='bip' order by money DESC LIMIT 1;

因为表很大,排序只是为了得到一条记录很长

我发现以下工作更快:

select distinct name,money from ducks where money=(select max(money) from ducks where car='bip')  LIMIT 1;

但仍然不确定,因为它是子选择。

解决这个问题的常用方法是什么?

http://sqlfiddle.com/#!2/d2b7ed/6

更新它变成了实际上我们的任务不是搜索同一辆车,而是搜索最富有的鸭子,它的价格低于 100000 美元

http://sqlfiddle.com/#!2/d2b7ed/21

4

1 回答 1

1

警惕子查询是明智的;特别是在 MySQL 中。

以下查询使用自排除连接,并且在基本测试中执行三者中最好的。您的第一个解决方案很好,但正如您所说的那样慢。它也不符合 ANSI,但这对您来说可能无关紧要。您的第二个解决方案也很好,但 MySQL 没有像希望的那样处理子查询;至少在传统上。

select 
  d.name, d.money
from 
  ducks d
  left join ducks d2 
  on d2.car = d.car 
  and d2.money > d.money
where 
  d.car = 'bip'
  and d2.id is null

在这里实现:http ://sqlfiddle.com/#!2/27711/20


编辑:球门柱以某种方式移动。该死的那些球门柱。这是新问题的自排除连接解决方​​案:http ://sqlfiddle.com/#!2/7146d/13

select 
  d.name, d.money 
from 
  ducks d
  left join ducks d2 
  on d2.money > d.money
  and d2.money < 100000
where 
  d.money < 100000 
  and d2.id is null;
于 2013-02-14T20:15:59.900 回答