【Mysql 学习】memory存储引擎

     MEMORY存储引擎用存在内存中的内容来创建表。每个MEMORY表和一个磁盘文件关联起来。文件名由表的名字开始,并且由一个.frm的扩展名来指明它存储的表定义。
要创建一个MEMORY表,可使用如下语句:
CREATE TABLE t (i INT) ENGINE = MEMORY;
   如它们名字所指明的,MEMORY表被存储在内存中,且默认使用哈希索引。这使得它们非常快,并且对创建临时表非常有用。可是,当服务器关闭之时,所有存储在MEMORY表里的数据被丢失。因为表的定义被存在磁盘上的.frm文件中,所以表自身继续存在,在服务器重启动时它们是空的。
这个例子显示你如何可以创建,使用并删除一个MEMORY表:

mysql> create table tab_memory engine=memory
    -> select id1,id2 ,val
    -> from myisam_auto;
Query OK, 9 rows affected (0.38 sec)
Records: 9  Duplicates: 0  Warnings: 0
MEMORY表有下列特征:
·以小块来分配MEMORY表的空间。表对插入使用100%动态哈希来。不需要溢出区或额外键空间。自由列表无额外的空间需求。已删除的行被放在一个以链接的列表里,并且在往表里插入新数据之时被重新使用。MEMORY表也没有通常与在哈希表中删除加插入相关的问题。
·MEMORY表可以有多达每个表32个索引,每个索引16列,以及500字节的最大键长度。
·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;
也可以使用如下语句创建:

mysql> create index mem_hash using hash on tab_memory(id1);
Query OK, 9 rows affected (0.06 sec)
Records: 9  Duplicates: 0  Warnings: 0

mysql> show index from tab_memory\G
*************************** 1. row ***************************
       Table: tab_memory
  Non_unique: 1
    Key_name: mem_hash
Seq_in_index: 1
 Column_name: id1
   Collation: NULL
 Cardinality: 3
    Sub_part: NULL
      Packed: NULL
        Null:
  Index_type: HASH
     Comment:
1 row in set (0.00 sec)

mysql> drop index mem_hash on tab_memory;
Query OK, 9 rows affected (0.08 sec)
Records: 9  Duplicates: 0  Warnings: 0

mysql> create index mem_hash using BTREE on tab_memory(id1);
Query OK, 9 rows affected (0.06 sec)
Records: 9  Duplicates: 0  Warnings: 0

mysql> show index from tab_memory\G
*************************** 1. row ***************************
       Table: tab_memory
  Non_unique: 1
    Key_name: mem_hash
Seq_in_index: 1
 Column_name: id1
   Collation: A
 Cardinality: NULL
    Sub_part: NULL
      Packed: NULL
        Null:
  Index_type: BTREE
     Comment:
1 row in set (0.02 sec)
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。 

时间: 2024-08-02 22:26:28

【Mysql 学习】memory存储引擎的相关文章

MySQL Memory 存储引擎浅析_Mysql

后来看到博客园在用NorthScale Memcached Server(官方站点:http://www.couchbase.com/products-and-services/memcached),貌似共享收费,又犹豫了.其实项目里的需求很简单,也想自己用.Net Cache来实现,但稳定性难以评估,开发维护成本又似乎太大,没办法,My SQL Memory Storage成了唯一选择,因为几乎不怎么需要编写代码. 先看官方手册,然后写了个简单的性能测试.因为官方最新的文档都是英文版的,所以译

MySQL的主流存储引擎介绍

我们知道MySQL最大的特色是其可插拔的插件式存储引擎,本文将介绍目前市面上主流的存储引擎.这里要特别提一 点:由于MySQL是开源的,所以如果你对某些存储引擎不满意,可以修改或写一个存储引擎,增加自己想要的特性(据我 所知,国内比较知名的有网易的TNT引擎),这也是MySQL作为开源数据库的魅力之一. 有些人刚接触MySQL的时候可能会有些惊讶,竟然有不支持事务的存储引擎,因为学过关系型数据库理论的人都知道 ,事务是关系型数据库的核心.但是在现实应用中(特别是互联网),为了提高性能,在某些场景

Mysqlslap性能测试MySQL三种存储引擎

测试环境: 操作系统:CentOS6.5_x64 Mysql版本:5.1.71 mysqlslap是设计来模拟多个客户端负载MySQL服务器,并报告每个阶段的时间诊断程序. mysqlslap运行在三个阶段: 1.创建模式,表,以及可选的存储程序或数据,用于测试.这个阶段使用单一客户端连接. 2.运行负载测试.这个阶段可以使用很多客户端连接. 3.清理(断开连接,如果指定删除表).这个阶段使用单一客户端连接. Mysql数据库默认最大连接数是100,一般生产环境是不够的,在my.cnf [mys

MySQL修改表存储引擎方法总结

MySQL作为最常用的数据库,经常遇到各种各样的问题.今天要说的就是表存储引擎的修改.有三种方式,列表如下. 1.真接修改.在数据多的时候比较慢,而且在修改时会影响读取性能.my_table是操作的表,innoDB是新的存储引擎.  代码如下 复制代码 ALTER TABLE my_table ENGINE=InnoDB 2.导出,导入.这个比较容易操作,直接把导出来的sql文件给改了,然后再导回去.用mysqldump ,枫哥常用的是navicate那样更容易上手.友情提醒风险较大. 3.创建

关于mysql的MERGE存储引擎简单例子

关于mysql的MERGE存储引擎简单例子 作用:可以将多个表结构相同的表 和合并到一个表中 版本支持:mysql5.1 如下例子: 假设有如下几个表:结构完全相同 article_0,article_1,article_2,article_3,   -- Table "article_0" DDL CREATE TABLE `article_0` (   `id` bigint(20) NOT NULL,   `subject` varchar(200) NOT NULL,   `c

MySQL查看修改存储引擎总结

本文总结了MySQL下查看.修改存储引擎的一些方法.测试.验证环境为MySQL 5.6 ,如有差异,请以实际版本为准   1:查看MySQL的存储引擎信息   1.1 使用show engines命令. Support列, YES表示当前版本支持这个存储引擎, DEFAULT表示该引擎是默认的引擎.NO表示不支持该存储引擎.如下所示,InnoDB是默认的存储引擎.   1.2 可以查看系统变量default_storage_engine或storage_engine        1:defau

MySQL数据库MyISAM存储引擎转为Innodb的方法_Mysql

mysql数据库存储引擎为MyISAM的时候,在大访问量的情况下数据表有可能会出现被锁的情况,这就会导致用户连接网站时超时而返回502,此时就需要MySQL数据库MyISAM存储引擎转为Innodb.步骤如下: 1.导出CentOS数据库的表结构 复制代码 代码如下: mysqldump -d -uxxx -p centos > centos_table.sql 其中-d参数表示不导出数据,只导出表结构 2.替换centos_table.sql里的MyISAM为INNODB 复制代码 代码如下:

mysql基础之存储引擎

原文:mysql基础之存储引擎 数据库对同样的数据,有着不同的存储方式和管理方式,在mysql中,称为存储引擎 常用的表的引擎 Myisam ,批量插入速度快, 不支持事务,锁表 Innodb, 批量插入相对较慢,支持事务,锁行. 常见引擎: 一个数据库目录解析:

MySQL修改表存储引擎安全做法

1.真接修改.在数据多的时候比较慢,而且在修改时会影响读取性能.my_table是操作的表,innoDB是新的存储引擎.  代码如下 复制代码 ALTER TABLE my_table ENGINE=InnoDB2. 导出,导入.这个比较容易操作,直接把导出来的sql文件给改了,然后再导回去.用mysqldump ,枫哥常用的是navicate那样更容易上手.友情提醒风险较大. 3.创建,插入.这个比第一种速度快, 安全性比第二种高,推荐.分2步操作 a.创建表,先创建一个和要操作表一样的表,然