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

解决方案 »

  1.   

    你的money也是有顺序的吗,从大->小?
    在数据库中没有顺序的概念,先进则在前面,排序是逻辑上的顺序。
    有可能没有用到abcid索引,EXPLAIN SQL语句,贴结果
      

  2.   

    你的自增字段是设计时就有,还是最后增加的?money字段是没有顺序的?
    如果没有指定ORDER BY,应该是按照物理顺序,即先进入表中的字段位置在前。
    最好EXPLAIN一下
      

  3.   

    未必会按物理顺序,要看MySQL的执行方案。如果不关心这种细节,则你可以认为,是由MySQL随意的,无法预期。
      

  4.   

    谢谢各位。
    explain的结果如下:
    select_type   table    type   key   key_len   ref   rows
    SIMPLE         abc      ref   abcid  4        const  307  
      

  5.   

    会按照你的记录在 abcid   这个KEY中的顺序进行排列。 由于你的 =1000 的值有好几个,这样顺序就是你记录在KEY中排列的物理顺序。你可以认为,是由MySQL随意的,无法预期。
      

  6.   

    如果可以,将你的记录导出,上传www.access911.net/csdn
    来测试一下,用WINRAR压缩
      

  7.   

    自己做个试验就可以了。 看一下各个语句输出的顺序为什么不同。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>
      

  8.   

    这要看mysql的执行方案,一般都是随意的!
      

  9.   

    既然是ACMAIN_CHM推荐的,那就看了要顶!
      

  10.   

    未必会按物理顺序,要看MySQL的执行方案。如果不关心这种细节,则你可以认为,是由MySQL随意的,无法预期。
      

  11.   

    想了解和寻求更多恋爱答案吗?
    到www.eluyouni.com
    帮你解决疑问
    寻找幸福
      

  12.   

    你无法设置一个数据表的排序。只能通过每条sql命令指定排序。一般情况下,是按照物理顺序降序排列的(INSERT的顺序)。