为什么同一个查询给出两个不同的结

时间:2012-06-20 17:58:45

标签: mysql sql optimization indexing

我创建了两张桌子和一张桌子。插入的值如下所示。

表1

create table maxID (myID varchar(4));

insert into maxID values ('A001');
insert into maxID values ('A002');
insert into maxID values ('A004');
insert into maxID values ('A003');

表2

create table maxID2 (myID varchar(4) PRIMARY KEY);

insert into maxID2 values ('A001');
insert into maxID2 values ('A002');
insert into maxID2 values ('A004');
insert into maxID2 values ('A003');

执行查询时

SELECT myId, @rowid:=@rowid+1 as myrow 
FROM maxID, (SELECT @rowid:=0) as init
ORDER BY myrow desc
LIMIT 1;

我输出为

+++++++++++++
myid + myrow
+++++++++++++
A003 + 4
+++++++++++++

执行查询时

SELECT myId, @rowid:=@rowid+1 as myrow 
FROM maxID2, (SELECT @rowid:=0) as init
ORDER BY myrow desc
LIMIT 1;

我输出为

+++++++++++++
myid + myrow
+++++++++++++
A004 + 4
+++++++++++++

两个表之间的区别在于,在第二个表中,我的myID为PRIMARY KEY

您可以在www.sqlfiddle.com查看以上数据/结果。

我的问题是

为什么在查询相同时我得到两个不同的结果?

注意: 此问题与我的旧问题 Getting last record from mysql 有点相关,其中我几乎得到了答案,Yak告诉我,行的顺序不能保证。 :(

2 个答案:

答案 0 :(得分:7)

这是因为当选定的字段集完全包含在给定的索引字段集中时,此索引用于检索数据而不是全扫描结果。

由于索引具有默认排序顺序,因此当原始表数据不具有时,使用索引的提取数据的排序顺序与完整表扫描的顺序不同。

在你的情况下,当你使用主键时,第4行确实是第4行,因为内部mysql(oracle,sql server ...)以这种方式组织它以更快地搜索数据。

请注意,您可能在两个查询中都获得了相同的结果,只是因为默认选择的结果顺序确实未被证明与插入的订单相关。

最后,让我警告你,如果你计划在mysql中添加一个具有特定顺序的索引(例如描述here),那么就可以在DESC命令中检索行,你可以不要这样做,因为它还不是mysql中允许的功能:

  

index_col_name规范可以以ASC或DESC结尾。这些   允许使用关键字以用于指定升序的未来扩展   或降序索引值存储。目前,他们被解析但是   忽略;索引值始终按升序存储。

答案 1 :(得分:4)

Primary keys are returned in sorted order by default

这就是为什么你为两个查询获得不同的输出。

您也可以查看其他示例:here is the example