1.我创建一个表
create table sort (
a int,
b int,
primary key (a));
2.然后我插入了三条记录
insert into sort values(1, 10), (2, 10), (3, 10);
3.当我选择使用此sql
时select * from sort order by b;
它给出了这样的结果
+---+------+
| a | b |
+---+------+
| 1 | 10 |
| 2 | 10 |
| 3 | 10 |
+---+------+
当我选择表时,请使用此查询
按b限制1从排序顺序中选择*;
结果集就是这个
+---+------+
| a | b |
+---+------+
| 3 | 10 |
+---+------+
这不是我排除的(我认为返回第一条记录是合理的)。
我的mysql版本是Ver 14.14 Distrib 5.6.23,for osx10.8(x86_64)
能解释一下吗?感谢。
答案 0 :(得分:0)
因为当您输入select * from sort order by b;
时,这将加载ACS
的隐藏字段。这意味着查询使用升序加载所有日期。
+---+------+
| a | b |
+---+------+
| 1 | 10 |
| 2 | 10 |
| 3 | 10 |
+---+------+
但如果您使用select * from sort order by b limit 1;
,则会再次使用ACS
加载数据,然后您的条件为LIMIT 1
。因此,在b
列中,所有内容均为10
,因此它将加载该值的最后添加值。
Bz
MySQL
将决定最后添加的行是最新的
答案 1 :(得分:0)
此SQL Server已经返回了合理的记录。 因为,您按具有相同数量的列进行排序(按服务评估)。
SQL Server的步骤是::
检查它是否已编入索引 - >从磁盘/索引读取表 - >排序数据 - >获取n个已排序的数据。
(你的查询中的n)
因此,这个SQL Server将从磁盘(存储)返回它在主表中找到的第一个,因为你没有索引它。
除非你通过a,b订购。
你的结果会得到1,10。
或者创建一个使数据顺序不同的索引。 (你也可以得到2,10)
否则,您将获得第一个插入数据到磁盘的结果。
答案 2 :(得分:0)
我实际上无法解释这种行为,因为我无法复制它。但是我可以证明OP的预期是我的mysql(Ver 14.14 Distrib 5.5.44,对于debian-linux-gnu(i686))的工作方式[NB,我以不同的顺序插入记录,以证明一点):
首先,没有主键:
mysql> create table sort (
-> a int,
-> b int);
mysql> insert into sort values (3,10),(2,10), (1,10);
mysql> select * from sort order by b limit 1;
+------+------+
| a | b |
+------+------+
| 3 | 10 |
+------+------+
显示第一个插入的记录
使用主键:
mysql> create table sort (
-> a int,
-> b int,
-> primary key (a));
mysql> insert into sort values (3,10),(2,10), (1,10);
mysql> select * from sort order by b limit 1;
+---+------+
| a | b |
+---+------+
| 1 | 10 |
+---+------+
这是一个myisam表(我的服务器上的默认值),因此该表有一个聚簇索引,这使得表以列a的顺序读取。因此,a = 1是第一个记录(我相信)。
最后,使用innodb:
mysql> create table sort ( a int, b int, primary key (a) ) engine=myisam;
mysql> insert into sort values (3,10),(2,10), (1,10);
mysql> select * from sort order by b limit 1;
+---+------+
| a | b |
+---+------+
| 3 | 10 |
+---+------+
没有聚集索引,因此返回第一条记录。
这些都没有解释OP声称的内容,但我不能让它发生。