表空间参数

max_heap_table_size

最小单位为字节B
[size=-1]  该变量设置 M[size=-1] EMORY (HEAP)表可以增长到的最大空间大小
每个Memory表和一个磁盘文件关联起来。文件名由表的名字开始,并且由一个.frm的扩展名来指明它存储的表定义
The maximum size of MEMORY tables is limited by    the max_heap_table_size system    variable, which has a default value of 16MB.
内存表的最大大小是由max_heap_table_size系统变量限制, 默认值为16 MB。

To enforce different    size limits for MEMORY tables, change the value    of this variable.
为内存表设置不同大小的限制 需要修改这个变量的值
The value in effect for    CREATE TABLE, or a subsequent    ALTER TABLE or    TRUNCATE TABLE, is the value used for    the life of the table.
在创建表 或者后来的alter table 或者 truncate table时 该值才生效  也是在table表的生命周期中被用到该值的体现
A server restart also sets the maximum size    of existing MEMORY tables to the global    max_heap_table_size value.
服务重启也会设置已经存在的所有内存表的大小为全局max_heap_table_size的值。

As mentioned earlier, the    max_heap_table_size system variable    sets the limit on the maximum size of MEMORY    tables. To control the maximum size for individual tables, set the    session value of this variable before creating each table. (Do not    change the global    max_heap_table_size value unless    you intend the value to be used for MEMORY tables    created by all clients.)
正如前面提到的,      max_heap_table_size系统变量设置最大内存表大小的限制 .
控制单个表的最大大小, 需要在创建每个表之前设置此session 中这个变量的值.
(除非你打算使    max_heap_table_size value 被之前所有客户端创建的内存表所应用 否则不要改变      max_heap_table_size 的值)


Managing Memory Use      The server needs sufficient memory to maintain all    MEMORY tables that are in use at the same time.  
    Memory is not reclaimed if you delete individual rows from a    MEMORY table. Memory is reclaimed only when the    entire table is deleted. Memory that was previously used for deleted    rows is re-used for new rows within the same table. To free all the    memory used by a MEMORY table when you no longer    require its contents, execute DELETE    or TRUNCATE TABLE to remove all rows,    or remove the table altogether using DROP    TABLE. To free up the memory used by deleted rows, use    ALTER TABLE ENGINE=MEMORY to force a table    rebuild.  


管理内存使用
服务器需要充足的内存以维持所有内存表同时被使用
如果你删除单个的行,内存不会回收利用.内存只有在整个表被deleted掉的时候才会回收利用 之前使用过被delete掉的行所占用的内存会在相同表中的新行所再次使用
当不再需要被使用的内存表的内容 想释放它所有的内存时 执行delete 或者truncate table 来删除所有的行 或者使用drop table 将表整个删除掉 .
如果通过delete 行释放内存,用alter table engine=memory 来强制重建一个表

MEMORY表有下列特征:
  • 给Memory表的空间被以小块来分配。表对插入使用100%动态哈希来。不需要溢出区或额外键空间。自由列表无额外的空间需求。已删除的行被放在一个以链接的列表里,并且在你往表里插入新数据之时被重新使用。Memory表也没有通常与在哈希表中删除加插入相关的问题。
  • MEMORY表可以有多达每个表64个索引,每个索引16列,以及3072字节的最大键长度。
  • MEMORY存储引擎支持HASH和BTREE索引。你可以通过添加一个如下所示的USING子句为给定的索引指定一个或另一个:
  • CREATE TABLE lookup
    (id INT, INDEX USING HASH (id))
    ENGINE = MEMORY;
    CREATE TABLE lookup
    (id INT, INDEX USING BTREE (id))
    ENGINE = MEMORY;


The following example creates two    MEMORY tables, with a maximum size of 1MB and    2MB, respectively:
  mysql> SET max_heap_table_size = 1024*1024;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE t1 (id INT, UNIQUE(id)) ENGINE = MEMORY;
Query OK, 0 rows affected (0.01 sec)
mysql> SET max_heap_table_size = 1024*1024*2;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE t2 (id INT, UNIQUE(id)) ENGINE = MEMORY;
Query OK, 0 rows affected (0.00 sec)



在系统参数中, 有MAX_HEAP_TABLE_SIZE和TMP_TABLE_SIZE两个参数来控制临时表的大小。当临时数据超过这两个参数的规定时,系统就会将内存临时表转换为磁盘临时表
磁盘临时表与内存临时表的差异
  磁盘临时表与内存临时表的差异,磁盘临时表只是内存临时的一个替代品。这就好像操作系的虚拟内存一样。当内存不够用时,可以在硬盘上的一个空间作为其替代品,将内存中的部门数据转移到虚拟内存中。这个磁盘临时表也是相同的道理。
  但是这里需要注意的是,硬盘的效率与内存的效率是不同的。在执行相同的一个作业时,内存的性能要高于硬盘的性能,一般会高上百倍,甚至上千倍。从这里就可以看出,为了提高数据库系统的性能,我们最好选择内存临时表,而放弃使用磁盘临时表。
BLOB和TEXT数据类型 会增加产生磁盘临时表的几率
这两个数据类型都用来存储大容量的数据。前者是采用二进制的形式来保存,而后者是采用字符形式来保存。
  这两个数据类型与其他数据类型有本质的不同。在MYSQL数据库中,是将这两个数据类型当做有实体的对象来处理。存储引擎也会采用特别的方式来保存他们。BLOB数据类型是采用二进制的方式来存储数据。而采用二进制来存储数据时,系统没有字符集的要求,也不会设置排序规则。相反,TEXT采用字符形式来存储数据,为此有字符集和排序规则的限制。
因为这两种数据类型的容量比较大,为此对对这些类型的字段进行操作时,临时表就会一下子变得很大。此时就很容易超过上面两个参数的限制。系统就会将内存临时表转换为磁盘临时表。为此这两种数据类型会增加产生磁盘临时表的几率
不同的存储类型对于数据类型的支持力度是不同的。如果某种存储类型不支持某些数据类型,那么系统就会直接采用磁盘临时表,即使数据没有超过其规定的大小
对于存储引擎,如果其不支持某些数据类型,那么对这些数据类型进行操作时,系统只能够使用磁盘临时表 如对于Memory存储引擎来说,其不支持BLOB和TEXT数据类型
在系统运行中,如果使用了BLOB和TEXT列,并且需要隐式临时表时,查询将不会使用内存临时表,而直接采用磁盘临时表。即使两个数据类型中的列存储的数据不多,也是如此。显然这会大大的降低数据库的性能


tmp_table_size 可动态改变 设置范围为1KB-4GB
只是一个限制mysql内部产生的内存临时表的阈值,超过这个值会被转移到磁盘上,并不是实际就要分配的这么大的内存数量。
如果内存内的临时表超过该值,MySQL自动将它转换为硬盘上的MyISAM表。如果你执行许多高级GROUP BY查询并且有大量内存,则可以增加tmp_table_size的值。
Created_tmp_disk_tables 与Created_tmp_tables 的比率过高,如超过10%,则 我们需要考虑是否tmp_table_size 这个系统参数所设置的足够大。当然,如果系
统内存有限,也就没有太多好的解决办法了。
show status  like 'Created_tmp_disk_tables';
show status  like 'Created_tmp_tables';

一般动态设置tmp_table_size的大小的时候,要使用:set global tmp_table_size=64*1024*1024而不是:set global tmp_table_size=64M
设置完之后退出 mysql 再次进入查看 就可生效(mysql 5.1.51)

参考:
1 http://dev.mysql.com/doc/refman/5.5/en/memory-storage-engine.html
2 http://unix-cd.com/vc/www/26/2011-05/17916.html

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27137314/viewspace-1191980/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/27137314/viewspace-1191980/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值