Fah*_*kar 5 mysql sql indexing optimization
我创建了两个表和插入值,如下所示.
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)
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通知我,行的顺序无法保证.:(
这是因为当所选字段集完全包含在给定索引字段集中时,此索引用于检索数据而不是全扫描结果.
由于索引具有默认排序顺序,因此当原始表数据不具有时,使用索引的提取数据的排序顺序与完整表扫描的顺序不同.
在你的情况下,当你使用主键时,第4行确实是第4行,因为内部mysql(oracle,sql server ...)以这种方式组织它以更快地搜索数据.
请注意,您可能在两个查询中获得了相同的结果,只是因为默认选择的结果顺序确实未被证明与插入的顺序相关.
最后,让我提醒你,如果你打算使用一个特定的顺序在mysql中添加一个索引(例如描述这里),因此检索行中,我们说了,DESC顺序,你不能这样做,因为它是不在mysql中允许的功能:
index_col_name规范可以以ASC或DESC结尾.这些关键字允许用于将来的扩展,以指定升序或降序索引值存储.目前,他们被解析但被忽略; 索引值始终按升序存储.