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;是可以看到新数据的。

    三、结论

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

  • 相关阅读:
    Oracle中常见的33个等待事件小结
    DATAGUARD中手工处理日志v$archive_GAP的方法
    ORACLE 如何定位消耗资源的SQL
    ORACLE 全局索引和本地索引
    Oracle中获取执行计划的几种方法分析
    BUFFER CACHE之主要的等待事件
    查看tablespace实际使用量和剩余空间
    Linux环境配置文件的理解
    Shell 传递参数
    Linux开局配置注意事项
  • 原文地址:https://www.cnblogs.com/lit10050528/p/4223233.html
Copyright © 2011-2022 走看看