1, PGA

    在Oracle中每个会话都会有PGA, MySQL中的会话也是如此. 主要包括三部份: (a), 堆栈区, 由THREAD_STACK变量来决定; (b), 接收缓冲(Receive Buffer/Connection Buffer), 由NET_BUFFER_LENGTH参数决定; (c), 发送缓冲(Send Buffer/Result Buffer), 同接收缓冲区同样大小. 当在执行SQL语时, 会将SQL语句的文本复制一份, 如果你的SQL写得很长, 这部份也不可以小看的哦! 当进程或线程不再需要时, 则这些内存区域会释放.

2, IO Buffer

    IO读取缓冲, 顺序读时由参数READ_BUFFER_SIZE控制大小, 而随机读时由READ_RND_BUFFER_SIZE参数来决定, 在InnoDB下据说是没用的, 因为InnoDB本身就缓冲机制, 但是在读取临时文件时是否有效呢? 象Oracle中有专门的SORT_MULTIBLOCK_READ_COUNT参数.

3, Sort Buffer

    象Oracle中的SORT_AREA_SIZE一样, MySQL也有参数SORT_BUFFER_SIZE来将数据放到内存来进行排序, 比较容易理解. 有一个问题是, 当排序操作执行完后, 这些内存是立刻释放呢? 还是要到会话结束呢?

4, Join Buffer

    我到现在还不明白这一块内存是怎么用的? 当一个表没有索引可以用时, MySQL用这一块内存区进行Fast Full Join, 每两个表之间的Full Join都会使用一块这个区域, 如果更复杂的SQL包括很多个表, 有可能要使用多个Join Buffer, 这下我更晕了, 理论上(按照Oracle的)最多两个就够了吧, 因为Join只能在两个表间进行. 另外MySQL中所有的内存中的表都以Hash方式组织, 因此好象都是Oracle的Hash Join了?

5, BLOB Buffer

    当我们去扫描一个有BLOB列的表时, 会要配一个和返回记录中最大的BLOB大小一样的缓冲区. 这个有点不爽了, 如果BLOB中有两G的数据呢? 这一块如何释放呢? SQL执行完了就释放?

    以上只是我在看书时的猜测, 请大家扔砖吧!