数据库是MySQL数据库表结构id - 整形 - 主键 (插入时已经是按顺序插入的,如 1 2 3 .. 10000000 ,插入后id就保持不变,不会被修改)
url - varchar - 唯一索引
....因为表很大,但是我需要按 id 的顺序读出并分析数据,所以写以下语句SELECT `id`, `url` ... FROM [table_name] ORDER BY `id`;加了 ORDER BY 语句后,数据量太大,发生异常。现在我想问的是,如果不加 ORDER BY `id` 会不会导致取出的数据是不按 `id` 的顺序排列的,比如会不会出现以下的情况:1 2 4 5 3 .... 10000000因为我看到有一个帖子说不加 ORDER BY 语句有可能会出现顺序不对的情况,谢谢。

解决方案 »

  1.   

    不加order by 应该是按照插入的顺序排序。
      

  2.   


    从理论上讲表中的记录是没有顺序的,所有不加 order by id 会出现这种问题,但要看你的表的存储引擎, 如果innodb则会按你的ID主键顺序,而myisam 则会以插入顺序。
      

  3.   

    这个应该不会呀。你确定是 MySQL 发生了什么异常吗?会不会是你的应用程序在处理过程中内存不足造成的?
      

  4.   


    1. 你的这个表的存储引擎是什么? (见 #3楼的说明)
    2. 贴一下你的错误信息,可以直接从MYSQL操作命令界面上复制,或者到MYSQL的错误日志中获取。
      

  5.   

    您每一次不要读那么多,确定最小和最大id
    select min(id),max(id) from table_name;
    #每一次读固定数量的记录,如
    SELECT `id`, `url` ... FROM [table_name] where `id`>=1 and `id`<10000; 
    #分析,再读取,再分析
    SELECT `id`, `url` ... FROM [table_name] where `id`>=10000 and `id`<20000; 
      

  6.   

    说一下我对分段读取这个事情的理解。按说,如果应用端的处理程序处理适当的话(指对内存的使用比较合理),应该不是很必要分段读取,毕竟这样会花费更多的查询时间。但的确有一种情况,如果查询结果集过大的话,会直接导致应用端内存不足。比如我在用 Java 的那个 mysql-connector 的时候就发现,它实际上是在你访问结果集中的第一条记录的时候,就把全部结果集都读到应用端的内存来,那当然死定了。好在有参数可以控制这个特性,做到“用多少取多少”。回到 LZ 的问题,我觉得从现象上有两点很难理解:1. 就算是有内存不足的异常,也应该是应用端的事儿,不应该是 MySQL 里面的事儿。2. 是不是发生内存不足的异常,应该跟用不用 ORDER BY 没有关系。希望 LZ 能给出进一步的描述说明。