mysql默认查询机制问题

xueshantujiu123 2009-06-01 06:00:59
加精
有个问题小弟想请教一下,mysql默认查询规则是什么?默认的查询是不是有默认的排序方式?
举个例子:
一个表table, abcid为主键,按照1开始自增,还有一些其它的字段,如name,money等;
select的时候例如:select * from user where money = 100;
查询结果按照abcid顺序排列。
再查一条select * from user where money = 1000;
查询结果可能就按照abcid逆序排序。

很不解,为什么查询结果会不稳定?
...全文
1579 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
pandaidea 2010-09-27
  • 打赏
  • 举报
回复
你无法设置一个数据表的排序。

只能通过每条sql命令指定排序。

一般情况下,是按照物理顺序降序排列的(INSERT的顺序)。
纯净水呐 2009-12-29
  • 打赏
  • 举报
回复
受益了
lyre129 2009-06-04
  • 打赏
  • 举报
回复
学习了,
懒得去死 2009-06-04
  • 打赏
  • 举报
回复
记录在表里是随机存储的,如果要按照特定的顺序显示,就需要手动指定。

kyc1987123 2009-06-04
  • 打赏
  • 举报
回复
顶下 收益非浅
teacher1998 2009-06-04
  • 打赏
  • 举报
回复
学习
冰岛男孩 2009-06-03
  • 打赏
  • 举报
回复
mark
luffyke 2009-06-03
  • 打赏
  • 举报
回复
这要看mysql的执行方案,一般都是随意的!
robyjeffding 2009-06-03
  • 打赏
  • 举报
回复
友情帮顶一下!
ACMAIN_CHM 2009-06-03
  • 打赏
  • 举报
回复

自己做个试验就可以了。 看一下各个语句输出的顺序为什么不同。

mysql> create table tx (
-> id int primary key,
-> col int
-> )engine=myisam;
Query OK, 0 rows affected (0.05 sec)

mysql> insert into tx values
-> (1 ,1),
-> (2 ,1),
-> (3 ,1),
-> (7 ,2),
-> (6 ,2),
-> (5 ,2),
-> (4 ,2),
-> (8 ,3),
-> (11 ,3),
-> (10 ,3),
-> (9 ,3);
Query OK, 11 rows affected (0.00 sec)
Records: 11 Duplicates: 0 Warnings:

-- 物理顺序
mysql> select * from tx;
+----+------+
| id | col |
+----+------+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 7 | 2 |
| 6 | 2 |
| 5 | 2 |
| 4 | 2 |
| 8 | 3 |
| 11 | 3 |
| 10 | 3 |
| 9 | 3 |
+----+------+
11 rows in set (0.00 sec)


-- 物理顺序
mysql> select id from tx where col=3;
+----+
| id |
+----+
| 8 |
| 11 |
| 10 |
| 9 |
+----+
4 rows in set (0.00 sec)


-- 主键顺序
mysql> select id from tx;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11 |
+----+
11 rows in set (0.00 sec)

mysql> create index tx_col on tx(col,id);
Query OK, 11 rows affected (0.08 sec)
Records: 11 Duplicates: 0 Warnings: 0

-- 加索引后为索引顺序
mysql> select * from tx where col=3;
+----+------+
| id | col |
+----+------+
| 8 | 3 |
| 9 | 3 |
| 10 | 3 |
| 11 | 3 |
+----+------+
4 rows in set (0.02 sec)

mysql>
WWWWA 2009-06-03
  • 打赏
  • 举报
回复
如果可以,将你的记录导出,上传www.access911.net/csdn
来测试一下,用WINRAR压缩
sdjn1985 2009-06-03
  • 打赏
  • 举报
回复
帮顶下
腾饽饽搁米 2009-06-03
  • 打赏
  • 举报
回复
想了解和寻求更多恋爱答案吗?
到www.eluyouni.com
帮你解决疑问
寻找幸福
menlglina 2009-06-03
  • 打赏
  • 举报
回复
未必会按物理顺序,要看MySQL的执行方案。如果不关心这种细节,则你可以认为,是由MySQL随意的,无法预期。
feilong5xian 2009-06-03
  • 打赏
  • 举报
回复
既然是ACMAIN_CHM推荐的,那就看了要顶!
ACMAIN_CHM 2009-06-02
  • 打赏
  • 举报
回复

未必会按物理顺序,要看MySQL的执行方案。如果不关心这种细节,则你可以认为,是由MySQL随意的,无法预期。
wwwwb 2009-06-02
  • 打赏
  • 举报
回复
你的自增字段是设计时就有,还是最后增加的?money字段是没有顺序的?
如果没有指定ORDER BY,应该是按照物理顺序,即先进入表中的字段位置在前。
最好EXPLAIN一下
WWWWA 2009-06-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 xueshantujiu123 的帖子:]
有个问题小弟想请教一下,mysql默认查询规则是什么?默认的查询是不是有默认的排序方式?
举个例子:
一个表table, abcid为主键,按照1开始自增,还有一些其它的字段,如name,money等;
select的时候例如:select * from user where money = 100;
查询结果按照abcid顺序排列。
再查一条select * from user where money = 1000;
查询结果可能就按照abcid逆序排序。

很不解,为什么查询结果会不稳定?
[/Quote]
你的money也是有顺序的吗,从大->小?
在数据库中没有顺序的概念,先进则在前面,排序是逻辑上的顺序。
有可能没有用到abcid索引,EXPLAIN SQL语句,贴结果
ACMAIN_CHM 2009-06-02
  • 打赏
  • 举报
回复

会按照你的记录在 abcid 这个KEY中的顺序进行排列。 由于你的 =1000 的值有好几个,这样顺序就是你记录在KEY中排列的物理顺序。

你可以认为,是由MySQL随意的,无法预期。
xueshantujiu123 2009-06-02
  • 打赏
  • 举报
回复
谢谢各位。
explain的结果如下:
select_type table type key key_len ref rows
SIMPLE abc ref abcid 4 const 307
加载更多回复(1)

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧