MySQL启动时,参加--init-file选项,将下列敕令参加到这个文件中,包管启动后内存表中稀有据。
- INSERT INTO ... SELECT
- LOAD DATA INFILE
内存表和复制(Replication)
办事看重启会导致内存表数据损掉。如不雅是主库,大年夜库没有意识到主库表中数据已被情况,所以在大年夜库你看到的是过时数据。
重启后,主大年夜库若何同步内存表数据?
当主库应用内存表,主库启动后,一条DELETE语句会写入到主库的binary log中,大年夜库接到敕令后清空内存表。
主库重启时代,大年夜库照样有攫取到过时数据的情况。为了避免这种情况,主库启动时参加--init-file参数,如许主库启动主动将数据加载到内存表中。(官方文档写的不严谨,我认为仅限于内存表只读场景。如不雅不是只读,即使参加--init-file参数也无法包管主库内存表数据一致)。
治理内存应用情况
办事器必须有足够内存,来知足多张内存表的应用。

根据不合的SQL萌芽,须要创建内存表的默认hash索引(基于独一键的单个值萌芽),或者B-tree索引(等值萌芽、不等值萌芽或者范围萌芽)。
MEMORY 存储引擎特点
如不雅大年夜内存表中删除零丁的行,并不会收受接收内存。当全部内存表删除时,才收受接收内存。同一张内存表,之前删除行占用的空间,会被新的行复竽暌姑。履行DELETE、TRUNCATE TABLE来释放内存表占用空间,如不雅表不在应用可应用DROP TABLE敕令。释放正在应用的内存表占用的内存,可以应用 ALTER TABLE XX ENGINE=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。
前面提到, max_heap_table_size 体系变量决定了内存表的最大年夜尺寸。在创建内存之前,可设置该变量控制每个内存表的最大年夜尺寸。(不建议修改全局 max_heap_table_size 的大年夜小,不然所有会话的内存表最大年夜尺寸都为该值 )。
下面的例子创建了2个内存表,最大年夜尺寸为1M和2M
- mysql> SET max_heap_table_size = 1024*1024;
- Query OK, 0 rows affected (0.00 sec)
- mysql> CREATE TABLE t1 (id INT, UNIQUE(id)) ENGINE = MEMORY;
- Query OK, 0 rows affected (0.01 sec)
- mysql> SET max_heap_table_size = 1024*1024*2;
- Query OK, 0 rows affected (0.00 sec)
- mysql> CREATE TABLE t2 (id INT, UNIQUE(id)) ENGINE = MEMORY;
- Query OK, 0 rows affected (0.00 sec)
办事看重启后,每个表的尺寸都变成了全局 max_heap_table_size 变量的值大年夜小。
压测结不雅
经由过程sysbench压测,InnoDB 写机能完爆MEMORY引擎,MEMORY的读机能略高于InnoDB。InnoDB的综合机能更好,足够知足日常应用。推敲到MEMORY引擎的雷点太多,建议不应用MEMORY引擎。
【编辑推荐】
- Oracle和MySQL的高可用筹划比较(一)
- 11 月全球数据库排名:PostgreSQL保持上升趋势 一路高涨
- 毕竟为什么要惹人数据库中心件
- 数据库高可用筹划PK:选择Oracle照样MySQL?
- 进步MySQL机能的7个技能
推荐阅读
11.11的脚步近了,是不是该囤货了,作为一个资深陪读爸妈是不是预备给本身,哦不,给孩子买一台家用功课打印机,毕竟师长教师如今很多多少都是发电子功课了......特别提示:如不雅小同伙的>>>详细阅读
本文标题:MySQL MEMORY引擎及性能比对
地址:http://www.17bianji.com/lsqh/38542.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示