MySQL每个Session所需要的内存情况
MySQL » http://www.anysql.net/mysql/mysql_session_memory_usage.html 2007-04-041, 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执行完了就释放?
以上只是我在看书时的猜测, 请大家扔砖吧!


Recent Comments