Mysql 数据库 memory引擎简介
使用场景:需要高速的动态的查询数据库,相比于memcached它的动态性更强。
如何查看自己当前的数据库的引擎。
mysql> show engines;
结果在附件中.
HEAP简介:(heap 其实就是memory引擎。)
HEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比MYISAM快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。
特性:
1.2 MEMORY引擎的存储特性
MEMORY引擎的数据及索引数据都存储于内存中,为此文件系统只会有一个单独的表定义文件,例如: MEMMORY引擎的表:t_memory,在数据库目录下只有:t_memory.frm文件,正是由于其所有数据都存储于内存中,除表定义信息有对应的实体文件存储于磁盘上外,只要mysqld服务不存在,则表中的数据全部丢失。
对MEMORY引擎表做DELETE删除数据的操作,并不是真正删除,而是标记为删除状态,只有新记录INSERT且写入同一张表才可重用,另外重建、重置、删除表、mysqld服务重启,才会释放掉被删除数据所占的内存。
1.3 数据类型的支持
1>.除BLOB、TEXT及二者的变种外,其他类型都支持;
2>.采用固定长度字段类型,即VARCHAR(50) 等同于CHAR(50);
3>.支持创建自增序列的字段;
4>.字段允许为NULL,同时索引也允许包含为NULL类型的字段;
1.4 索引的支持
1.5 存储空间范围 MEMORY存储引擎拥有的存储空间,取决于设置全局变量:max_heap_table_size的值为多大。
使用:
CREATE TABLE t (i INT) ENGINE = MYISAM;
注释:老版本的MySQL使用TYPE而不是ENGINE(例如,TYPE = MYISAM)。MySQL 5.1为向下兼容而支持这个语法,但TYPE现在被轻视,而ENGINE是首先的用法。
测试:
二.触发器的知识点
2.1 语法
当通过SQL(INSERT、UPDATE、DELETE)语句使表中的数据发生变化,能捕获到此变化的程序,即是我们常用到的触发器,是一种类似于存储过程,而具有特殊作用的程序。
2.1.1创建
CREATE [DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
2.1.2 删除
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name
2.2 限制
1>.一个数据库中不能有同名的触发器程序;
2>.同一表上,对同一个事件的响应处理不能有二个及以上的触发器;
3>.触发器无法显示调用执行,也无法像函数或存储过程一样显示地传递参数;
4>.通过关键字OLD.column_name获得的值不能通过SET命令修改,但是关键字NEW获得的值能通过SET NEW.column_name=VALUE方式修改;
5>.触发器的处理部分不能含有事务的关键字,例如:ROLLBACK等;
6>.创建了触发器的表,若支持事务,则触发器也会受事务执行成功还是失败的影响,且触发器程序执行成功还是失败,也会影响事务的执行是成功还是失败;若不支持事务,则也无法支持事务的回滚操作;
三.模拟的业务场景
1.对某表中部分符合规定要求的数据UPDATE业务操作量大,且要求响应时间短;
2.确保数据的安全性;
3.为满足上述要求,且不增加额外的开发成本,需要从非MEMORY引擎表中读取数据到MEMORY引擎表中;
4.对MEMORY引擎表中的数据,只有UPDATE业务操作;
5.通过触发器的方式,更新InnoDB引擎表中的数据;
测试过程如下:
1>.创建用于测试2张表,存储引擎分别为:MEMORY、InnoDB
CREATE TABLE `t_memory` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`username` VARCHAR(40) NOT NULL,
PRIMARY KEY(`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8 COLLATE 'utf8_general_ci';
CREATE TABLE `t_innodb` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`username` VARCHAR(40) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE 'utf8_general_ci';
2>.添加几条测试数据
INSERT INTO t_innodb(username) value('a'),('asdfasdf'),('q235423573sdf'),('afdhfhswqertqw');
INSERT INTO t_memory SELECT * from t_innodb;
3>.创建基于MEMORY引擎的表上的更新触发器
DELIMITER &&
CREATE TRIGGER tri_memory_update AFTER UPDATE ON t_memory FOR EACH ROW
BEGIN
UPDATE t_innodb SET username=NEW.username WHERE username=OLD.username;
END &&
DELIMITER ;
4>.对比2张表中的数据
root@localhost : test 03:58:25> select * from t_memory;
+----+----------------+
| id | username |
+----+----------------+
| 1 | a |
| 2 | asdfasdf |
| 3 | q235423573sdf |
| 4 | afdhfhswqertqw |
+----+----------------+
4 rows in set (0.00 sec)
root@localhost : test 03:58:32> select * from t_innodb;
+----+----------------+
| id | username |
+----+----------------+
| 1 | a |
| 4 | afdhfhswqertqw |
| 2 | asdfasdf |
| 3 | q235423573sdf |
+----+----------------+
4 rows in set (0.00 sec)
5>.对MEMORY引擎表执行更新模拟操作
UPDATE t_memory SET username='769067806dfgh' WHERE ID=1;
6>.更新之后的数据对比
root@localhost : test 03:58:25> select * from t_memory;
+----+----------------+
| id | username |
+----+----------------+
| 1 | 769067806dfgh |
| 2 | asdfasdf |
| 3 | q235423573sdf |
| 4 | afdhfhswqertqw |
+----+----------------+
4 rows in set (0.00 sec)
root@localhost : test 03:58:32> select * from t_innodb;
+----+----------------+
| id | username |
+----+----------------+
| 1 | 769067806dfgh |
| 4 | afdhfhswqertqw |
| 2 | asdfasdf |
| 3 | q235423573sdf |
+----+----------------+
4 rows in set (0.00 sec)
7>.重新启动mysqld服务,然后查看对比2张表中的数据
root@localhost : test 04:10:05> select * from t_innodb;
+----+----------------+
| id | username |
+----+----------------+
| 1 | 769067806dfgh |
| 4 | afdhfhswqertqw |
| 2 | asdfasdf |
| 3 | q235423573sdf |
+----+----------------+
4 rows in set (0.02 sec)
root@localhost : test 04:10:12> select * from t_memory;
Empty set (0.00 sec)
若是采用MEMORY引擎表支持在线业务,另外再使用触发器或者类似触发器的其他程序完成数据同步到实体表,那么从MEMORY引擎特点、业务等角度提出以下建议:
1>.MEMORY引擎存储表中,只使用数值类型、日期类型的字段且为TIMESTAMP类型,不要使用字符串类型;
2>.删除MEMORY引擎表中的数据之后,使用语句ALTER TABLE tablename ENGINE=MEMORY释放掉被删除数据而占用的内存;
3>.只使用MEMORY引擎表支持UPDATE操作业务;
4>.对MEMORY引擎表的数据操作,最好是根据主键去完成,以便最快速度完成操作,而不影响其他线程的操作;
5>.不要是用MEMORY引擎表支持数据量过大的业务,比如数据量1G以上;
6>.要定期清理MEMORY引擎表中不需要的数据,以便腾出内存;
7>.参数max_heap_table_size的值要设置合理,考虑系统资源及数据量可能有多大;
8>.MEMORY引擎不支持事务,为此使用触发器完成数据同步的工作,要考虑响应操作的时间点(BEFOR/AFTER),由于操作可能会很频繁,实体表建议使用支持事务的引擎,比如:InnoDB引擎;
相关推荐
既然Mysql有内存引擎Memory,为什么还需要Redis 随着对于Mysql的了解,我们知道Mysql有三种常用的...Memory引擎是Mysql的内存引擎,在实现上,Memory存储引擎不同于Innodb这种组织索引结构(索引即是数据,即数据存放
MySQL 5.7支持的存储引擎有:InnoDB、MyISAM、Memory、Merge、Archive、Federated、CSV和BLACKHOLE等。 可以利用语句:show engines; 查看系统所支持的引擎类型。;1.InnoDB存储引擎 InnoDB是事务型数据库的首选引擎...
MySQL 支持多种存储引擎,目前的存储引擎有 MyISAM 、 InnoDB 、 BDB 、 Memory 、 Merge 、 Archive 、 Federated 、 BLACKHOLE 、 Cluster/NDB 、 CSV 、 Example 等。其中, InnoDB 、 NDB 、 BDB 支持事务,其他...
Memory存储引擎在日常的工作中使用的是比较少的,但是在MySQL的某些语法中,会用到memory引擎的内存表,它有以下几个特点: 1、内存表的建表语法是create table … engine=memory。 2、这种表的数据都保存在内存里...
MySQL支持数个存储引擎作为对不同表的类型的处理器。...就像MyISAM一样,MEMORY和MERGE存储引擎处理非事务表,这两个引擎也都被默认包含在MySQL中。 注释:MEMORY存储引擎正式地被确定为HEAP引擎。 ◆ InnoDB和B
后来看到博客园在用NorthScale Memcached Server(官方站点:...因为官方最新的文档都是英文版的,所以译了5.5版本 MySQL Memory Storage章节。 官方文档(译自5.5版本的The Me
07.MySQL高级存储引擎Memory与Merge特性.avi 08.MySQL高级存储引擎选择原则.avi 09.MySQL高级优化SQL步骤SQL执行频率.avi 10.MySQL高级优化SQL步骤定位低效SQL.avi 11.MySQL高级优化SQL步骤explain指令介绍.avi 12....
动力节点的杜老师讲述的mysql教程,详细讲解了MySQL的相关知识,包括MySQL概述,MySQL应用环境,MySQL系统特性,MySQL初学基础,MySQL管理工具,如何安装MySQL及MySQL新特性,通过观看可掌握MySQL全套知识。
7.3.10 多列索引 7.3.11 使用来自其他数据库引擎的列类型 7.4 用在SELECT和WHERE子句的函数 7.4.1 分组函数 7.4.2 常用的算术运算 7.4.3 位函数 7.4.4 逻辑运算 7.4.5 比较运算符 ...
1.1 存储引擎的介绍 1.1.1 文件系统存储 文件系统:操作系统组织和存取数据的一种机制。文件系统是一种软件。 类型:ext2 3 4 ,xfs 数据。 不管使用什么文件系统,数据内容不会变化,不同的是,存储空间、大小、...
比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但...
6.1. 复制介绍 6.2. 复制实施概述 6.3. 复制实施细节 6.3.1. 复制主线程状态 6.3.2. 复制从I/O线程状态 6.3.3. 复制从SQL线程状态 6.3.4. 复制传递和状态文件 6.4. 如何设置复制 6.5. 不同MySQL版本之间的复制兼容性...
7.3.8 为列选择正确的类型 7.3.9 列索引 7.3.10 多列索引 7.3.11 使用来自其他数据库引擎的列类型 7.4 用在SELECT和WHERE子句的函数 7.4.1 分组函数 7.4.2 常用的算术运算 ...
MySQL支持多种存储引擎,如InnoDB、MyISAM、MEMORY等,每种引擎都有特定的优势和适用场景。例如,InnoDB提供事务安全、行级锁定和外键约束,适合处理高并发事务性的应用;MyISAM则更侧重于读取密集型操作,提供全文...
MySQL默认的存储引擎是MyISAM,其他常用的就是InnoDB,另外还有MERGE、MEMORY(HEAP)等。 主要的几个存储引擎 MyISAM管理非事务表,提供高速存储和检索,以及全文搜索能力。 MyISAM是Mysql的默认存储引擎。当create...
* 1 MySQL的一般的信息 o 1.1 什么是MySQL? o 1.2 关于本手册 + 1.2.1 本手册中使用的约定 o 1.3 MySQL的历史 o 1.4 MySQL的主要特征 o 1.5 MySQL稳定性? o 1.6 顺应2000年 o 1.7 SQL一般信息和教程 o ...
11.7. 使用来自其他数据库引擎的列类型 12. 函数和操作符 12.1. 操作符 12.1.1. 操作符优先级 12.1.2. 圆括号 12.1.3. 比较函数和操作符 12.1.4. 逻辑操作符 12.2. 控制流程函数 12.3. 字符串函数 12.3.1. 字符串...
6.1. 复制介绍 6.2. 复制实施概述 6.3. 复制实施细节 6.3.1. 复制主线程状态 6.3.2. 复制从I/O线程状态 6.3.3. 复制从SQL线程状态 6.3.4. 复制传递和状态文件 6.4. 如何设置复制 6.5. 不同MySQL版本之间的复制兼容性...
使用来自其他数据库引擎的列类型 12. 函数和操作符 12.1. 操作符 12.1.1. 操作符优先级 12.1.2. 圆括号 12.1.3. 比较函数和操作符 12.1.4. 逻辑操作符 12.2. 控制流程函数 12.3. 字符串...