mysql左连接,限制和排序

时间:2011-03-13 22:25:51

标签: mysql sorting

我怀疑。我需要在两个表之间进行左连接并且只得到第一个结果(我的意思是表A上的第一个记录与表B上的任何内容都不匹配)。 这是一个例子

create table a (
id int not null auto_increment primary key,
name varchar(50),
surname varchar(50),
prov char(2)
) engine = myisam;

insert into a (name,surname,prov)
values ('aaa','aaa','ss'),('bbb','bbb','ca'),('ccc','ccc','mi'),('ddd','ddd','mi'),('eee','eee','to'),
       ('fff','fff','mi'),('ggg','ggg','ss'),('hhh','hhh','mi'),('jjj','jjj','ss'),('kkk','kkk','to');


create table b (
id int not null auto_increment primary key,
id_name int
) engine = myisam;

insert into b (id_name) values (3),(4),(8),(5),(10),(1);

查询A:

select a.*
from a
left join b
on a.id = b.id_name 
where b.id_name is null and a.prov = 'ss'
order by a.id
limit 1

查询B:

select a.*
from a
left join b
on a.id = b.id_name 
where b.id_name is null and a.prov = 'ss'
limit 1

两个查询都给出了正确的结果,即id = 7的记录。 我想知道我是否可以依赖查询B,即使没有指定id的排序,或者只是我得到了正确的结果。

我问,因为在大型记录集(超过1000万行)上,没有排序的查询在应用排序时立即给我一条记录,即使a.id是主键,它也需要20秒以上。

提前致谢。

2 个答案:

答案 0 :(得分:1)

你不能依赖查询B. Mysql只返回它发现的更快的返回。

答案 1 :(得分:0)

列“id_name”上的表“b”上是否有索引?如果没有,那么创建它并告诉我们你得到了什么(我的意思是多快)没关系你正在寻找不匹配的行,必须先进行JOIN才能测试是否匹配。