mysql 临时表 heap_mysql优化: 内存表和临时表

由于直接使用临时表来创建中间表,其速度不如人意,因而就有了把临时表建成内存表的想法。但内存表和临时表的区别且并不熟悉,需要查找资料了。

一开始以为临时表是创建后存在,当连接断开时临时表就会被删除,即临时表是存在于磁盘上的。而实际操作中发现临时表创建后去目录下查看发现并没有发现对应的临时表文件(未断开链接).因而猜测临时表的数据和结构都是存放在内存中,而不是在磁盘中.

这样一想内存表不是也是存在在内存中吗,那么他和临时表有什么区别?他们的速度是什么样子?

查找了官方手册有以下的一些解释:

The MEMORY storage engine creates tables with contents that are stored in memory. Formerly, these were known as HEAP tables. MEMORY is the preferred term, although HEAP remains supported for backward compatibility.

Each MEMORY table is associated with one disk file. The filename begins with the table name and has an extension of .frm to indicate that it stores the table definition.

由此可以看出来内存表会把表结构存放在磁盘上,把数据放在内存中。

并做了以下实验:

临时表

mysql> create temporary table tmp1(id int not null);

Query OK, 0 rows affected (0.00 sec)

mysql> show create table tmp1;

+-------+----------------------------------------------------------------------------------------------+

| Table | Create Table |

+-------+----------------------------------------------------------------------------------------------+

| tmp1 | CREATE TEMPORARY TABLE `tmp1` ( `id` int(11) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8 |

+-------+----------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

内存表

mysql> create table tmp2(id int not null) TYPE=HEAP;

Query OK, 0 rows affected (0.00 sec)

mysql> show create table tmp2;

+-------+------------------------------------------------------------------------------------+

| Table | Create Table |

+-------+------------------------------------------------------------------------------------+

| tmp2 | CREATE TABLE `tmp2` (

`id` int(11) NOT NULL

) ENGINE=MEMORY DEFAULT CHARSET=utf8 |

+-------+------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

可以看出来临时表和内存表的ENGINE 不同,临时表默认的是MyISAM,而内存表是MEMORY .去数据库目录查看,发现tmp2.frm而没有tmp1表的任何文件。看来实际情况是符合官方解释的。

那么速度方面呢(即MyISAM和MEMORY之间的区别)?

实验开始:

实现手段:对基于2张千万级别的表做一些OLAP切分操作,中间表的建立使用2种不同的方式。最后把中间表的数据按照要求取出,插入到结果表中

实验目的;测试临时内存表和临时表的速度

1.中间表的建立使用Create temporary table type = heap 即 把中间表建立成临时内存表

2.中间表直接使用Create temporary table建立

实验结果:

临时内存表: 1小时

1 2008-09-25 11:03:48

1 2008-09-25 12:03:39

临时表:1小时17分钟

2 2008-09-25 12:25:28

2 2008-09-25 13:42:37

由此发现MEMORY比MyISAM快大概20%。

接着查找官方手册:

As indicated by the name, MEMORY tables are stored in memory. They use hash indexes by default, which makes them very fast, and very useful for creating temporary tables. However, when the server shuts down, all rows stored in MEMORY tables are lost. The tables themselves continue to exist because their definitions are stored in .frm files on disk, but they are empty when the server restarts.

可以看出来MEMORY确实是very fast,and very useful for creating temporary tables .把临时表和内存表放在一起使用确实会快不少:create table tmp2(id int not null) engine memory;

内存表的建立还有一些限制条件:

MEMORY tables cannot contain        BLOB or TEXT columns.

HEAP不支持BLOB/TEXT列。

The server needs sufficient memory to maintain all   MEMORY tables that are in use at the same time.

在同一时间需要足够的内存.

To free memory used by a MEMORY table when   you no longer require its contents, you should execute DELETE or TRUNCATE TABLE, or remove the table altogether using DROP

TABLE.为了释放内存,你应该执行DELETE FROM heap_table或DROP TABLE heap_table。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

序列化与反序列化的单例模式_序列化代理模式

序列化与反序列化的单例模式在上一篇文章中 ,我谈到了一般的序列化。 这是更加集中的内容,并提供了一个细节: 序列化代理模式 。 这是处理序列化中许多问题的一种好方法,通常是最好的方法。 如果开发人员只想了解这一主题&#xf…

图解C语言的希尔排序

希尔排序是插入排序的一种,又称“缩小增量排序”,希尔排序是直接插入排序算法的一种更高效的改进版本。希尔排序的基本思想设等待排序等元素序列有n个元素,首先取一个整数increment(小于n)作为间隔将全部元素分为n/inc…

给oim_对OIM Web(UI)层进行压力测试

给oimOracle IDM中的默认配置保留20个专用于服务前端(UI)请求的线程 。 这基本上意味着应用程序服务器具有20个线程池,可用于为通过Web控制台(/ identity或/ sysadmin)访问OIM的用户提供服务。 对于Weblogic &#xf…

windows mysql is read only_mysql中Table is read only错误解决方法(转载)

下面来给各位同学介绍一下关于mysql中Table is read only的解决技巧,希望例子能帮助到各位。今天再我把数据库data 拷贝到linux 下运行程序 ”mysql中Table is read only的解决“ 出现这样的问题,查询资料。linux下执行如下命令即可#mysqladmin -u root…

C语言打印输出红色字体

除了Linux,在VS下也可以实现变色这一效果,先看下面的一段代码:#include int main(int argc,char **argv){ printf("\033[44;37;5m hello world\033[0m\n");return 0;}编译后运行上述代码,结果如下:可见&…

mysql g月份分组_PowerBI快捷键——视觉对象分组功能

PowerBI的2020年4月份更新虽然发布在5月份,但的确是提供了很多强大的功能。在以往,要选中多个视觉对象,往往需要按住CTRL键挨个单击选中,然后在进行下一步的分组或其他操作。但是在4月份更新中,PowerBI允许我们通过在画…

编译原理抽象语法树_平衡抽象原理

编译原理抽象语法树使代码复杂易读和理解的一件事是&#xff0c;方法内部的指令处于不同的抽象级别。 假设我们的应用程序仅允许登录用户查看其朋友的旅行。 如果用户不是朋友&#xff0c;则不会显示任何行程。 一个例子&#xff1a; public List<Trip> tripsByFriend…

谈谈单片机编程思想——状态机

玩单片机还可以&#xff0c;各个外设也都会驱动&#xff0c;但是如果让你完整的写一套代码时&#xff0c;却无逻辑与框架可言。这说明编程还处于比较低的水平&#xff0c;你需要学会一种好的编程框架或者一种编程思想&#xff01;比如模块化编程、状态机编程、分层思想等。本文…

C语言结构体使用与指针的理解

以前总有一种疑惑。为什么结构体的指针有的需要用分配空间&#xff1f;有的不需要分配空间呢&#xff1f;现在总结一下思路&#xff1a;一&#xff1a;关于结构体的定义问题&#xff1a;使用结构体一般会使用变量或者定义指针typedef struct{ int a; int b; }data;使用这个结构…

elementui 进度条怎么做_小E,Excel中这样的进度条是怎么做出来的?

我的目标&#xff1a;让中国的大学生走出校门的那一刻就已经具备这些office技能&#xff0c;让职场人士能高效使用office为其服务。支持我&#xff0c;也为自己加油&#xff01;前面我们分享过如何做进度条&#xff1a;《Excel进度条启示&#xff1a;专注与持续积累定会让人生出…

adf4351使用_使用ADF BC管理保存点

adf4351使用在使用ADF BC时&#xff0c;我们通常依赖于在数据库中执行DML操作的框架。 该框架在DBTransaction提交周期内正确地在数据库中进行了所有必要的更新。 很酷的事情是&#xff0c;在这种情况下&#xff0c;数据库事务将被自动管理。 因此&#xff0c;如果出现问题&…

C语言结构体描述BMP的文件格式

BMP文件的结构其实非常简单&#xff0c;就是两个结构体&#xff0b;一个可选的调色板&#xff0b;位图数据。第一个结构体是BITMAPFILEHEADER&#xff0c;第二个结构体是BITMAPINFOHEADER。然后就是可选的调色板&#xff08;RGBQUAD数组&#xff09;。最后是位图数据。第一个结…

java必读书籍_必读:Java Java

java必读书籍他们没有在Comp Sci&#xff0c;工程学或MIS中教appsec&#xff0c;但是您却学会了编程。 而且他们可能仍然没有。 因此&#xff0c;您将如何得知XSS过滤器逃避或单击劫持攻击&#xff0c;或如何真正安全地存储密码。 您的公司无力为您提供昂贵的Appsec培训&#…

php mysql 常用语句_PHP mysql基本语句指令

1 /* 选择数据库 2 use test; 3 */ 4 5 /* 显示所有的数据库 6 show databases; 7 */ 8 9 /* 删除表/数据库 10 drop database test1; 11 delete from user1 where id4; 12 */ 13 14 /* 创建表 15 CREATE TABLE user1( 16 id int primary key auto_increment1 /*选择数据库2 us…

列表流和feed流_通过流而不是列表

列表流和feed流开幕式免责声明&#xff1a;这并不总是一个好主意。 我将介绍这个想法&#xff0c;以及为什么它是一个好主意的一些原因&#xff0c;但随后我将讨论一些不太理想的实例。 懒惰 如您所知&#xff0c;我在Python中的学习几乎和在Java中一样。 我一发现Python就很喜…

mysql数据导出不完正_【MySQL】mysqldump 导出数据 常见问题

1、使用mysqldump时报错(1064)&#xff0c;这个是因为mysqldump版本太低与当前数据库版本不一致导致的mysqldump: Couldnt execute SET OPTION SQL_QUOTE_SHOW_CREATE1: You have an error in your SQL syntax; check the manual thatcorresponds to your MySQL server version…

C语言Main函数到底有几种,你真的懂吗?

乍一看标题&#xff0c;感觉小编小题大做&#xff0c;但凡学过C语言的聚聚&#xff0c;都知道C程序入口就是main函数&#xff0c;且一套程序里面有且仅有一个。但是很多时候我们看到的main函数却并不是千篇一律&#xff0c;格式竟然会有差别&#xff0c;这究竟是为啥&#xff1…

java泛型类指定多个泛型_Java泛型中的多态

java泛型类指定多个泛型从作为Java程序员的早期开始&#xff0c;我们都知道如何实例化和使用Collection对象。 实例化为具体类的List接口将如下所示。 List myArrayList new ArrayList();如果myArrayList应该仅保存Integer对象&#xff0c;则从Java 5编译器开始&#xff0c…

python大型项目经验_图像分类:13个Kaggle项目的经验总结

来源&#xff1a;数据派THU任何领域的成功都可以归结为一套小规则和基本原则&#xff0c;当它们结合在一起时会产生伟大的结果。机器学习和图像分类也不例外&#xff0c;工程师们可以通过参加像Kaggle这样的竞赛来展示最佳实践。在这篇文章中&#xff0c;我将给你很多资源来学习…

C语言程序main入口函数

一.main()函数是什么样的我们先要搞清楚main()函数有哪几种&#xff1f;查阅C89/C99/C11标准文档&#xff0c;里面明确固定了两种写法&#xff1a;int main(void) { /* ... */ }int main(int argc, char *argv[]) { /* ... */ }除此之外&#xff0c;其他写法应该都是不规范的写…