技术开发 频道

基于存储引擎MEMORY加触发器的应用场景

  测试过程如下:

  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服务直接KILL掉操作系统级别的进程及保护进程(备注:先KILL掉保护进程)

  8>.重新启动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引擎;

0
相关文章