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

Fah*_*kar 5 mysql sql indexing optimization

我创建了两个表和插入值,如下所示.

表格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');
Run Code Online (Sandbox Code Playgroud)

表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');
Run Code Online (Sandbox Code Playgroud)

当我执行查询

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

我输出为

+++++++++++++
myid + myrow
+++++++++++++
A003 + 4
+++++++++++++
Run Code Online (Sandbox Code Playgroud)

当我执行查询

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

我输出为

+++++++++++++
myid + myrow
+++++++++++++
A004 + 4
+++++++++++++
Run Code Online (Sandbox Code Playgroud)

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

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

我的问题是

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

注意:这个问题与我的旧问题有点相关,从mysql获取最后一条记录,我几乎得到了答案,Yak通知我,行的顺序无法保证.:(

Seb*_*bas 7

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

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

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

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

最后,让我提醒你,如果你打算使用一个特定的顺序在mysql中添加一个索引(例如描述这里),因此检索行中,我们说了,DESC顺序,你不能这样做,因为它是不在mysql中允许的功能:

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