zoukankan      html  css  js  c++  java
  • mysql之内存表

    一、引言

    昨天下午老大让我查资料看一下mysql的内存表在主从备份中是否能被复制,我还没听说过内存表呢,于是上网查资料,记录一下,以便查阅、学习

    二、进展

    参考:

    http://www.cnblogs.com/sunss/p/3191137.html

    内存表:
    复制代码
    session 1
    $ mysql -uroot
    root@(none) 10:05:06>use test
    Database changed
    root@test 10:06:06>CREATE TABLE tmp_memory (i INT) ENGINE = MEMORY;
    Query OK, 0 rows affected (0.00 sec)
    root@test 10:08:46>insert into tmp_memory values (1);
    Query OK, 1 row affected (0.00 sec)
    root@test 10:08:46>
    
    session2
    $ mysql -uroot test
    root@test 10:05:12>CREATE TABLE tmp_memory (i INT) ENGINE = MEMORY;
    ERROR 1050 (42S01): Table 'tmp_memory' already exists
    root@test 10:16:27>select * from tmp_memory;
    +------+
    | i |
    +------+
    | 1 |
    +------+
    1 row in set (0.00 sec)
    复制代码
    1. 多个session,创建表的名字不能一样
    
    2. 一个session创建会话后,对其他session也是可见的
    3. data目录下只有tmp_memory.frm ,表结构放在磁盘上,数据放在内存中
    4. mysql 重启或者关闭后内存表里的数据会丢失,但是表结构仍然存在
    5. 可以创建索引,删除索引,支持唯一索引
    6. 不影响主备,主库上插入的数据,备库也可以查到
    7. show tables 看得到表
    View Code

    http://www.cnblogs.com/sunss/archive/2011/03/16/1986050.html

      “内存表”顾名思义创建在内存中的表,真是这样吗?其实不然,MySQL的内存表,表结构创建在磁盘上,数据存放在内存中,所以当MySQL启动着的时候,这个表是存在的,数据也是存在的,如果用户有查看这个表的权限,在所有会话里面,都可以访问这个内存表的数据;当MySQL重启后,数据消失,结构还存在。
    
    内存表的创建:
    
    CREATE TABLE test(
      id int(10),
      num int(10)
    ) ENGINE=MEMORY DEFAULT CHARSET=utf8;
    查看是否创建成功:
    
    show tables;
    使用完内存表后,如果我们想释放掉占用掉的内存,可以有两种方法:
    -- 删除数据
    delete from test;
    或者
    
    -- 清空表
    truncate table test;
    再或者
    -- 删除表
    drop table test;
    对于我们常用的功能来说,内存有以下特征:
    
    1.对于varchar等变长类型,内存表使用固定的长度来存放;
    
    2.内存表可以有非唯一键;
    
    3.内存表不能包含BLOB或者TEXT列;
    
    4.内存表支持AUTO_INCREMENT列;
    
    5.内存表支持插入延迟,使读取优先;
    
    6.非临时内存表和其它非内存表一样在所有客户端直接共享;
    
    我们使用内存表的时候,需要注意以下几个方面:
    
    1.服务器内存足够大;
    
    2.我们创建的内存表和MySQL内部临时表有所不同:
    
          内存表的数据存放在内存中,而内部临时表(我们的query语句产生的)在恰当的时候存放在内存中,当内部临时表变得很大时,MySQL会自动地把它转化为 在磁盘上存储的表,而我们创建的内存表,却不会自动转换。
    
    3.当我们单独地delete from 某个内存表的时候,不会回收内存;只有当整个表被delete的时候,才会回收内存;
    
    4.在MySQL的主从服务器上,内存表可以被复制
    View Code

    http://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html (mysql官方文档,英文不好,参考的不多,英文还需继续努力)

    自己的实践--mysql单机

    可见执行insert into tblName select * from heapTbl;是可以将数据复制的。

    实践--mysql主备--结构:192.168.0.161:2000--192.168.0.161:2001

    1.在2000节点上创建内存数据库testHeap并插入数据
    create table testHeap(i int) type=heap;
    在2001节点上show tables是可以看到testHeap的,并且是有数据的。
    
    
    2.在2001节点上对表testHeap插入一些数据
    在2000节点上select * from testHeap;是可以看到新数据的。

    三、结论

    内存表在主从备份结构中是可以被复制的。

  • 相关阅读:
    动态规划——Best Time to Buy and Sell Stock IV
    动态规划——Split Array Largest Sum
    动态规划——Burst Ballons
    动态规划——Best Time to Buy and Sell Stock III
    动态规划——Edit Distance
    动态规划——Longest Valid Parentheses
    动态规划——Valid Permutations for DI Sequence
    构建之法阅读笔记05
    构建之法阅读笔记04
    构建之法阅读笔记03
  • 原文地址:https://www.cnblogs.com/lit10050528/p/4223233.html
Copyright © 2011-2022 走看看