当前位置:网站首页 / 数据库 / 正文

ay msql 笔记 memory存储引擎【11】

时间:2017年04月09日 | 作者 : aaronyang | 分类 : 数据库 | 浏览: 1146次 | 评论 0

======================================== AYUI       www.ayjs.net      AY  ===============
CREATE TABLE Test_MemoryTable (i INT) ENGINE = MEMORY


blob.png

测试sql

create table test_memory engine=memory
select id1,id2 ,val
from myisam_testauto;

 MEMORY存储引擎用存在内存中的内容来创建表。每个MEMORY表和一个磁盘文件关联起来。文件名由表的名字开始,并且由一个.frm的扩展名来指明它存储的表定义。

如它们名字所指明的,MEMORY表被存储在内存中,且默认使用哈希索引。这使得它们非常快,并且对创建临时表非常有用。可是,当服务器关闭之时,所有存储在MEMORY表里的数据被丢失。因为表的定义被存在磁盘上的.frm文件中,所以表自身继续存在,在服务器重启动时它们是空的


====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang==============


MEMORY表有下列特征: 

·以小块来分配MEMORY表的空间。表对插入使用100%动态哈希来。不需要溢出区或额外键空间。自由列表无额外的空间需求。已删除的行被放在一个以链接的列表里,并且在往表里插入新数据之时被重新使用。MEMORY表也没有通常与在哈希表中删除加插入相关的问题。 

·MEMORY表可以有多达每个表32个索引,每个索引16列,以及500字节的最大键长度。 

·MEMORY存储引擎执行HASH和BTREE索引。你可以通过添加一个如下所示的USING子句为给定的列,增加某种索引,hash或者btree: 



CREATE TABLE lookup(id INT, INDEX USING HASH (id))ENGINE = MEMORY;

CREATE TABLE lookup(id INT, INDEX USING BTREE (id)) ENGINE = MEMORY;

也可以这样后期加上索引

create index mem_hash using hash on test_memory(id1);

blob.png

show index from test_memory

blob.png




删除索引

blob.png

blob.png



增加一个btree索引

blob.png



====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang==============


B树的一般特征和哈希索引将在以后的博客中描述。 

· 可以在一个MEMORY表中有非唯一键。(对哈希索引的实现,这是一个不常用的功能)。 

· 可以对MEMORY表使用INSERT DELAYED。 

· 如果你在一个有高度键重复的(许多索引条目包含同一个值)MEMORY表上有一个哈希索引,对影响键值的表的更新及所有删除都是明显地慢的。这个变慢的程度比例于重复的程度(或者反比于索引cardinality)。你可以使用一个B树索引来避免这个问题。 

·MEMORY表使用一个固定的记录长度格式。 

·MEMORY不支持BLOB或TEXT列。 

·MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列的索引。 

·MEMORY表在所有客户端之间共享(就像其它任何非TEMPORARY表)。 

·MEMORY表内容被存在内存中,内存是MEMORY表和服务器在查询处理之时的空闲中创建的内部表共享。可是,两个类型的表不同在于MEMORY表不会遇到存储转换,而内部表是: 

- 如果一个内部表变得太大,服务器自动把它转换为一个磁盘表。尺寸限制由tmp_table_size系统变量的值来确定。 

- MEMORY表决不会转换成磁盘表。要确保你不会偶尔做点傻事,你可以设置max_heap_table_size系统变量给MEMORY表加以最大尺寸。对于单个的表,你也可以在CREATE TABLE语句中指定一个MAX_ROWS表选项。 

·服务器需要足够内存来维持所有在同一时间使用的MEMORY表。 

·当你不再需要MEMORY表的内容之时,要释放被MEMORY表使用的内存,你应该执行DELETE FROM或TRUNCATE TABLE,或者整个地删除表(使用DROP TABLE)。 

·当MySQL服务器启动时,如果你想开拓MEMORY表,你可以使用--init-file选项。例如,你可以把INSERT INTO ... SELECT 或LOAD DATA INFILE这样的语句放入这个文件中以便从持久稳固的的数据源装载表。 LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;

·如果你正使用复制,当主服务器被关闭且重启动之时,主服务器的MEMORY表变空。可是从服务器意识不到这些表已经变空,所以如果你从它们选择数据,它就返回过时的内容。自从服务器启动后,当一个MEMORY表在主服务器上第一次被使用之时,一个DELETE FROM语句被自动写进主服务器的二进制日志,因此再次让从服务器与主服务器同步。注意,即使使用这个策略,在主服务器的重启和它第一次使用该表之间的间隔中,从服务器仍旧在表中有过时数据。可是,如果你使用--init-file选项于主服务器启动之时在其上推行MEMORY表。它确保这个时间间隔为零。

·在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*))

ALIGN()代表round-up因子,它使得行的长度为char指针大小的确切倍数。sizeof(char*)在32位机器上是4,在64位机器上是8。



====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang==============

文章参考:地址


memory表默认创建index是hash索引,要是在程序中大量使用等值查询一类sql语句,但是如果出现大量的范围查找还是指定btree比较好.

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

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

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

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

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;
delimiter #
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
    #


录入1000条数据

blob.png


blob.png

我们重启mysql服务

blob.png

数据已经没了。



====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========






推荐您阅读更多有关于“mysql,”的文章

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

  查看权限

合肥科大智能常年招聘C# .NET CORE,vue前端,JAVA开发,有想换工作的私聊我AY唯一QQ:875556003和AY交流

抖音号:wpfui 工作是wpf,不接活,目前主要折腾maui

AYUI8社区版Github地址:前往获取

杨洋(AaronYang简称AY,安徽六安人)目前是个人,还没公司AY唯一QQ:875556003和AY交流

高中学历,2010年开始web开发,2015年1月17日开始,兴趣学习研究WPF

声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费.AY主要靠卖技术服务挣钱

不是从我处购买的ayui7源码,我不提供任何技术服务,如果你举报从哪里买的,我可以帮你转正为我的客户,并送demo

查看捐赠

AYUI7.X MVC教程 更新如下:

第一课 第二课 程序加密教程

vs2015 企业版密钥HM6NR-QXX7C-DFW2Y-8B82K-WTYJV

vs2017 企业版密钥NJVYC-BMHX2-G77MM-4XJMR-6Q8QF

标签列表