经分析是由于我的表中的数据量太大了,有200万条记录。当执行完如下SQL后,系统报错ERROR CODE=28,说是在c:\WINDOWS目录下的某个临时文件无法写入了。我看了一下C盘已经没有任何剩余空间了。原因是表太大,所以查询时生成的临时表过大,因此出错。我的C盘有约1G的FREE SPACE.我执行了SQL如下:
SELECT *
FROM TABLE_NAME
ORDER BYE FIELD1, FIELD2.我发现只要带ORDER BY参数肯定会出这个问题,哪怕ORDER BY子句中只带一个字段也是这样的,查询相当相当的慢!最终报错——临时文件无法写入,不带ORDER BY 子句就不会出现这个问题。请问这个问题能解决吗?

解决方案 »

  1.   

    再补充一句:order by 中的字段均是有索引的,同样都是慢!表的storage engine 也试过不同的类型均是这样的慢。难道大表就不能用ORDER BY语句吗? ORACLE是不是不会出现这种问题只有MYSQL存在此问题?
      

  2.   

    没有办法,如果你要对100万条记录进行排序,又没有索引,MYSQL必然要用到文件进行排序运算。
      

  3.   

    那ORACLE或SQL SERVER也是这样的吗?如果MYSQL确实存在此问题,而其它商用数据库没有此问题,那我在考虑是否改用ORACLE或SQL SEVER 了。
      

  4.   

    也是这样,ORALCE需要利用临时表空间来进行排序(无索引情况下)。所有数据库都会有此问题。
    这种情况应该是数据库设计的时候就应当考虑。
      

  5.   

    如果对order by中的字段(组),创建聚簇索引,那么,开销就会非常小了。
      

  6.   

    1 你非要一次出200万条数据么?
    2 在my.ini中把临时目录指向空间大的磁盘即可。
    tmpdir=E:\TEMP2
      

  7.   

    不好意思,这么晚才回复各位,这几天比较忙.我确实要一次要提取200万条数据,这只是个测试数据,未来的数据量还要比这个大!我的PC内存4Gbytes, 但真正的物理内存占用并不高啊!查询时内存在1G左右占用.MYSQL为什么不多占用一些内存,非要用到I/O比较慢的DISK,我的MEMORY明明是很空闲的,是否需要改一些MYSQL的配置参数才可以用到更多的内存空间?否则只会用虚拟内存.要知道I/O是很慢的.再有,如果我SELECT的列字段只选一个是否会好一些,因为如果只投影一个字段的话,需要的存储空间会少很多,这样也就很快一些?