最近在看mysql select的原理
但是很多只提到了select的一个流程,没有说明mysql生成结果集在mysql中是怎么处理的,是一行一行的发给客户端呢,还是先产生一个临时内存区域,在将内存区域中保存的结果集发给客户端。
例如,a join b  on a.id =b.id where a.test>6 and b.cc<3,看过人的一个gdb测试
1.三个条件
a.test > 6
a.id = b.id
b.cc<32.先通过a.test>6过滤a表,(那么过滤a表之后的临时结果放那?如果是内存,那么多个查询就会导致内存不够,如果过滤后条目比较多的话)
3.然后过滤b表,并通过b.id=a.id过滤a,b表,产生结果集(这结果集是不是也需要存在内存呢)

解决方案 »

  1.   

    楼主的意思应该是SQL执行过程中,每一步都是产生一个结果集,其实也就是虚拟表。可以看看这个帖子:http://blog.csdn.net/weiwangchao_/article/details/31389675,具体虚拟表是不是暂存在内存中,我的感觉应该是在内存中。具体控制数据可能溢出的机制,就不太清楚了~~
      

  2.   

    楼主的这个话题很大,牵扯到许多计算机的基础知识理解。否则怎么说都对,怎么说或者都不对。一、所有的CPU操作只能和内存进行,也就是说所有的数据都在内存中。
    二、内存不足时,操作系统会使用虚拟内存。
    三、具体的查询要看数据库系统产生的执行计划。
      

  3.   

    @VertigozZ 刚做了个实验,我选了两张数据量大的表,关联了一下,确实会占用很大的内存,物理内存快被耗尽,同时虚拟内存也占用很大,说明确实临时结果保存在内存,内存不够,用到了虚拟内存。
      

  4.   


    恩呢  但是我猜想mysql应该对内存有一定的优化,或者说是当数据大的时候,肯定有相关的机制保证!
      

  5.   

    你可以select一个超级大的表  看看服务器和客户端的内存分别是如何使用的
      

  6.   

    yuanzaixin
    本版等级:T1
    结帖率:0%当您的问题得到解答后请及时结贴.
    http://topic.csdn.net/u/20090501/15/7548d251-aec2-4975-a9bf-ca09a5551ba5.html
    http://topic.csdn.net/u/20100428/09/BC9E0908-F250-42A6-8765-B50A82FE186A.html
    http://topic.csdn.net/u/20100626/09/f35a4763-4b59-49c3-8061-d48fdbc29561.html8、如何给分和结贴?
    http://bbs.csdn.net/help#post_dispose
      

  7.   

    MySQL结果集的只指啥?有中间结果集也有发送结果集,这是不一样的,中间结果集有临时内存表和临时磁盘表