前言

  刚刚遇到了mysql无法插入数据,报错:the table xxx is full。

  查询原因,是xx表使用了memory engine,其中mysql的memory engine中有max_heap_table_size = 256M限制,数据稍多就满了。

  解决,修改mysql的配置文件my.ini

#根据自己需求修改大小
tmp_table_size = 256M
max_heap_table_size = 256M

关于memory engine

  1.memory表默认创建index是hash索引,虽然memory也支持btree索引,但需要指定.这里就有个值得注意的地方了,要是在程序中大量使用等值查询一类sql语句,但是如果出现大量的范围查找还是指定btree比较好.

  2.innodb表也支持把数据和索引完全加载到内存中,相比之下,memory占用的内存要小于innodb,且memory全表扫描效率略高于innodb,这应该是和innodb独特的类btree数据结构有关.当然并不能说innodb不如memory,只是读方面和全表扫描上,毕竟行级锁和事务的innodb在大规模的写操作和数据安全性上是memory不能比的.

  3,当数据量比较多的时候一定要修改max_heap_table_size系统变量,否则会限制插入.即使突破了改变的限制,memory表的大小还是会受到OS内存寻址空间,和物理内存的限制,物理内存好理解,在32位的OS上最大支持4G的内存寻址空间也很好理解.

  4.memory不支持text.blob字段类型.使用memory引擎最好不要存太大的数据,实在费内存.memory中char和varchar类型并没有什么区别.

  5.挡在MySQL Replication中使用memory的时候,如果master重启而slave没有的话,那么master自启动开始就没有数据,而slave中则依然存在数据.直到该内存在master上第一次被调用的时候,master会在binlog中写入一条deleted from语句来删除数据,所以这个时候,slave中有在master启动到执行第一条sql之间的间隔时间的过期数据.这个可以通过master上配置--init-file选项来解决

附:
A.memory占用内存的官方计算公式

     SUM_OVER_ALL_BTREE_KEYS(max_length_of_key + sizeof(char*) * 4)

     + SUM_OVER_ALL_HASH_KEYS(sizeof(char*) * 2)

     + ALIGN(length_of_row+1, sizeof(char*))

B.建表的sql和生成测试数据的sp

root@localhost in zhwq 06:59:15>create table mem(
-> id int auto_increment not null primary key,
-> num int default 100,
-> datetime datetime,
-> index mem_num_b (num) using btree,
-> index mem_num (num),
-> index mem_dt_b (datetime) using btree,
-> index mem_dt (datetime))engine=memory character set utf8;
Query OK, 0 rows affected (0.04 sec)
root@localhost in zhwq 06:59:43>delimiter #
root@localhost in zhwq 07:03:20>create procedure insert_mem(p int)
-> begin
-> set @i = 0;
-> repeat
-> insert into mem (num,datetime) values(floor(rand()*1000),now());
-> set @i = @i+1;
-> until @i > p end repeat;
-> end
-> #
Query OK, 0 rows affected (0.03 sec) root@localhost in zhwq 07:20:02>delimiter ; root@localhost in zhwq 07:20:07>call insert_mem(1000);
Query OK, 0 rows affected (0.05 sec)

有网友测试过memory和memcache之间的性能比对,个人认为两者的场景一般不会相同,可比性不太大,有空再研究下

参考

[1] kevon_sun.解决mysql出现"the table is full"的问题 .http://blog.csdn.net/kevon_sun/article/details/7967728

[2] xiao7ng.MySQL Memory Engine Test.http://blog.csdn.net/xiao7ng/article/details/5423877

mysql memory engine的更多相关文章

  1. memcached vs MySQL Memory engine table 速度比较_XMPP Jabber即时通讯开发实践_百度空间

    memcached vs MySQL Memory engine table 速度比较_XMPP Jabber即时通讯开发实践_百度空间 memcached vs MySQL Memory engin ...

  2. mysql memory

    mysql memory engine 创建: mysql> create table mt engine = memory select * from information_schema.t ...

  3. 提高mysql memory(heap) engine内存性能的开源补丁_XMPP Jabber即时通讯开发实践_百度空间

    提高mysql memory(heap) engine内存性能的开源补丁_XMPP Jabber即时通讯开发实践_百度空间 提高mysql memory(heap) engine内存性能的开源补丁

  4. 精讚部落::MySQL 的MEMORY engine

    精讚部落::MySQL 的MEMORY engine MySQL 的MEMORY engine 無次要群組

  5. 14.1.1 InnoDB as the Default MySQL Storage Engine

    14.1 Introduction to InnoDB 14.1.1 InnoDB as the Default MySQL Storage Engine 14.1.2 Checking InnoDB ...

  6. MySQL Memory 存储引擎浅析

    原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/ 前言 需求源自项目中的MemCache需求,開始想用MemCached(官方网站:http://memcac ...

  7. mysql memory存储引擎简单测试

    Auth: jin Date: 20140423 mysql> CREATE TABLE `t4` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` ...

  8. MySQL memory引擎 table is full 问题处理

    解决mysql的内存表“table is full”错误   101209 13:13:32 [ERROR] /usr/local/mysql/bin/mysqld: The table ‘test_ ...

  9. mysql memory表性能测试以及使用场景

    最近公司计划将风控逻辑移到slave库进行计算,因为考虑到业务表数据会比较大,此时如果还是走nest-loop的话,即使unique进行连接,因为还是需要至少2次以上LIO才能读一条记录,如果达到类似 ...

随机推荐

  1. 软件公司的两种管理方式 总体来说,这个世界上存在两种不同的软件公司的组织结构。我把他们叫做 Widget Factory(小商品工厂) 和 Film Crews(电影工作组

    软件公司的两种管理方式 一个简单的回答应该是——“因为在我们的社会里,我们总是会认为薪水和会和职位的层次绑在一起”.但是,这个答案同时也折射出一个事实——我们的薪资是基于我们的所理解的价值,但这并没有 ...

  2. ruby的sort方法的重新认识

    ruby中的sort方法,这个方法可以加一个两个参数的block,这个block可以返回1 0 -1来表示这两个参数大于 等于 小于示例: str = ["192.160.175" ...

  3. STDIN_FILENO的作用及与stdin 的区别

    1.STDIN_FILENO的作用 STDIN_FILENO属于系统API接口库,其声明为 int 型,是一个打开文件句柄,对应的函数主要包括 open/read/write/close 等系统级调用 ...

  4. Python学习笔记(九)—— 函数

    一.函数调用: 1.python内部函数查询:http://docs.python.org/3/library/functions.html#abs 2.注意调用函数的参数个数和类型. 3.函数名其实 ...

  5. ROS学习(五)—— 编译ROS Package

    提前准备: 记得事先source你的环境配置(setup)文件,在Ubuntu中的操作指令如下. source /opt/ros/kinetic/setup.bash 一.使用catkin_make ...

  6. Jquery 数组操作(转)

    在jquery中处理JSON数组的情况中遍历用到的比较多,但是用添加移除这些好像不是太多. 今天试过json[i].remove(),json.remove(i)之后都不行,看网页的DOM对象中好像J ...

  7. VS与SQL资源

    经常在网上看到有同学费尽心思的找SQL server数据库各版本的下载地址,看到别人的求助贴就不自觉的想去帮助他们,但是一个一个去帮助又不太现实,毕竟个人精力有限,既然大家有需求,那么笔者就本着乐于分 ...

  8. block(八)作用域

    //闭包 NSString* s =@"123"; void (^block)() = ^() { NSLog(@"%@",s); }; block();// ...

  9. [Perforce]password (P4PASSWD) invalid or unset. 的错误解决

    前言 使用 Perforce , 能够使用Perforce 的Client 端. 有时候在编写一些脚本或代码的时候, 可能或使用到 Perforce的命令的方式. 正常状况下. 使用例如以下命令: p ...

  10. kafak manager + zookeeper + kafka 消费队列快速清除

    做性能测试时,kafka消息队列比较长,让程序自己消费完毕需要等待很长时间.就需要快速清理kafka队列 清理方式把 这kafak manager + zookeeper + kafka 这些应用情况 ...