日期:2014-05-16  浏览次数:20692 次

mysql 排序规则
sid 是主键 order_no 是唯一索引

谁能帮我解释一下3次查询结果 为什么不一样, 在3个sql 的排序规则都是什么
SQL code

mysql> select sid,order_no,order_status from oms_order   limit 10;
+-----+----------------+--------------+
| sid | order_no       | order_status |
+-----+----------------+--------------+
|  20 | 20100319000003 |            0 |
|  21 | 20100319000004 |            0 |
|  63 | 20100319000046 |           -1 |
|  69 | 20100320000006 |            0 |
|  76 | 20100323000001 |            0 |
|  77 | 20100323000002 |            0 |
|  78 | 20100323000003 |            0 |
|  79 | 20100323000004 |            8 |
|  86 | 20100324000007 |           -1 |
|  93 | 20100324000014 |           -1 |
+-----+----------------+--------------+
10 rows in set (0.00 sec)

mysql> select sid,order_status from oms_order   limit 10;
+-----+--------------+
| sid | order_status |
+-----+--------------+
| 240 |           -1 |
| 261 |           -1 |
| 263 |           -1 |
| 285 |           -1 |
| 286 |           -1 |
| 288 |           -1 |
| 339 |           -1 |
| 383 |           -1 |
| 387 |           -1 |
| 452 |           -1 |
+-----+--------------+
10 rows in set (0.00 sec)

mysql> select sid from oms_order   limit 10;
+---------+
| sid     |
+---------+
| 1171641 |
| 1171651 |
| 1171661 |
| 1171671 |
| 1171681 |
| 1171691 |
| 1171701 |
|      20 |
|      21 |
|      63 |
+---------+
10 rows in set (0.00 sec)



------解决方案--------------------
没有加 order by 的话,查出来的就是物理顺序,如果没有做过删除操作,那么应该是这样的:

select sid,order_no,order_status from oms_order limit 10;
这个肯定优先使用 sid 排序,再使用 order_no 排序

select sid,order_status from oms_order limit 10;
sid 排序

select sid from oms_order limit 10;
这个只有 sid,只好使用它排序了,看上去 sid 是字符型的数据,所以 1171701 在 20 前。

------解决方案--------------------
没有ORDER则由MYSQL自行处理顺序,而这个顺序则和记录的物理顺序,索引的顺序相关。