mysql - 内存表使用总结

部分转载:https://blog.csdn.net/hemeinvyiqiluoben/article/details/51222951?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control

http://my.oschina.net/lanzp/blog/369179

内存表使用哈希散列索引把数据保存在内存中,因此具有极快的速度,适合缓存中小型数据库,但是使用上受到一些限制
定义:
create table (...)  engine = memory/heap ;  (一般使用memory,heap用得少了)
用法:
①、内存表的数据是使用hash的方式存储在内存上,故其查询的时候只支持 <> 和 = 这两种比较方式;
②、内存表的数据可以对所有用户的连接可见,但是其不能跨服务器重启; 服务器重启后,内存表中的所有数据都将丢失,但是表结构还在,因为表结构是存储在磁盘中;
③、内存表的数据在max_heap_table_size这里设定,若单张表行数超过了这个长度,则报数据满错误 ; 我电脑里的mysql本参数默认值是16777216 ;
④、内存表不支持事务,而且是表锁,当修改频繁时,性能会下降
⑤、内存表使用一个固定的记录长度格式,一般来说不要用varchar类型,如果使用了它会以varchar的最大长度来申请内存。内存表不支持BLOB或TEXT类型
⑥、内存表不支持auto_increment <我的新版的mysql测试时支持 自增列的>;只允许对非空数据列进行索引(not null)
⑦、如果heap是复制的某数据表,则复制之后所有主键、索引、自增等格式将不复存在,需要重新添加主键和索引,如果需要的话。


首先,我们来说一下什么是内存表,所谓内存表,是指整个数据库表都常驻在内存中的表,相对于普通表而言,内存表存储数据在内存中,而普通表存储在硬盘中。那么内存表到底有什么特点呢?下面我们来详细地分析一下。
1.MySQL内存表要怎样创建呢?

 首先,我们先来学习一下到底要怎样创建一个内存表呢?方法很简单,就跟普通表差不多,唯一的差异是,内存表所使用的数据库引擎是内存。如下:
 

create table test(c1 int primary key, c2 varchar(50)) engine = memory;

 

我们普通表的引擎一般是InnoDB,我们要使用内存表,就必须把引擎设置成MEMORY。内存表的结构存放在磁盘上,扩展名为.frm, 所以重启不会丢失。但是数据是存储在内存当中,所以重启之后,表数据会全部丢失。

2.MySQL内存表到底有什么限制?

  如果你平时设计数据库表的时候,有喜欢使用varchar类型的习惯的话,那么,你使用内存表的时候,就需要注意到一个细节了。我们都知道,在使用内存之前,都要先申请一段内存,那么也就是说,内存表在创建之后,每一行要使用的内存就已经固定下来了,但是我们都知道,varchar类型是动态可变长度,只有一个上限值,那么内存表会怎么做呢,先看下面一个例子:

以上面的表为例,假如有这么两条记录:

10000,'greatWall!'  

10001,'qq!'

普通表占用空间 -> 10000,'greatWall!'+10001,'qq!'

内存表占用空间 -> 10000,'greatWall!    '+10001,'qq!          '

从上面的对比我们可以知道,内存表中如果使用了varchar类型,那么表创建的时候,会以varchar最大的长度来申请内存,这样,如果我们如果设计长度不合理的时候,就会造成内存浪费。并且内存表不支持BLOB或TEXT类型,这个不支持的原因也可以理解了。内存表不支持事务,因为内存表是表锁,所以当修改频繁时会影响表的性能。

再者,是表大小的问题,内存表到底能有多大?理论上说,只要你内存足够大,表就可以有多大,但是默认内存表默认的大小是64MB(如果我没有记错的话),如果我们要设置成自己想要的大小,我们需要在my.cnf文件中修改max_heap_table_size参数,修改完成后,要重启MySQL才会生效。如果我们的表满了以后,MySQL并不会把数据存储到硬盘中,而是直接报表已经满了的错误。
3.我们使用内存表的时候还需要注意些什么操作?

  我之前用100GB的内存做了测试,建了35张表,其中有一张表插入了大概30GB左右的数据,其他34张表平均不到1GB的数据,然后我尝试在30GB的表里面做了turncate操作,卡了一段时间之后,操作成功,但其他34张表也受到了影响,数据竟然全部不见了!于是我又继续插入上次的数据,再对34张表中的其中任意一张表做turncate操作,这次竟然没有影响,我猜测可能是内存占用过大的话,会有什么不可预料的事情发生吧,这一切发生在RHEL,具体什么原因也不太清楚了。

 后来我尝试使用delete、update语句可以正常使用,不过由于是表锁机制,所以我们在实际使用过程中,也要注意操作表的先后顺序,保证读或者写的时候,没有其他连接操作把表锁住了,不然你会发现你的操作会失败,并且MySQL不会告诉你表已经锁了,这个时候就只能靠自己的直觉去判断是不是表锁了。
————————————————
 

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

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

相关文章

《集体智慧编程》——第一章导读

为什么80%的码农都做不了架构师&#xff1f;>>> 什么是集体智慧 其含义是指&#xff1a;为了长早新的想法&#xff0c;而将一群人的行为、偏好或思想组合在一起。 完成这项工作的一种最为基础的方法&#xff0c;便是使用调查问卷或普查。从一大群人中搜集的答案可…

使用spring的@autowired注解,无法实例化dao

首先理解spring的注解注入dao接口的目的是什么&#xff0c;是为了接口不用进行实例化就可以被任何一个类去调用 我昨天下午就是发现&#xff0c;不同的类&#xff0c;一模一样的注解&#xff0c;为什么前面的类可以使用注解调用mapper的sql查询&#xff0c;但是 第二个类死活无…

大括号之谜:C++的列表初始化语法解析

转载&#xff1a; https://segmentfault.com/a/1190000039362151 摘要&#xff1a;有朋友在使用std::array时发现一个奇怪的问题&#xff1a;当元素类型是复合类型时&#xff0c;编译通不过。 有朋友在使用std::array时发现一个奇怪的问题&#xff1a;当元素类型是复合类型时&a…

在Mono 2.8上部署ASP.NET MVC 2

Mono 2.8发布&#xff1a;C#4.0和更好的性能&#xff0c;我们知道Mono 2.8对ASP.NET MVC 2的完全支持&#xff0c;下面我们就来测试下在Mono 2.8上部署ASP.NET MVC 2应用程序。我的环境是Opensuse 11.3,通过以下命令部署好Mono 2.8的开发环境&#xff0c;之所以说是开发环境是同…

ASP.NET C# 数字格式化输出

int a 12345678; //格式为sring输出 Label1.Text string.Format("asdfadsf{0}adsfasdf",a); Label2.Text "asdfadsf"a.ToString()"adsfasdf"; Label1.Text string.Format("asdfadsf{0:C}adsfasdf",a);//asdfadsf&#xffe5;1,234…

gdb调试时,Program received signal SIGPIPE, Broken pipe.

今天在gdb调试时&#xff0c;发现总是出现Program received signal SIGPIPE, Broken pipe&#xff0c;搜索了网上的资料&#xff0c;发现是在调试时&#xff0c;接收到了SIGPIPE这个signal信号导致调试被中断。 By default, gdb captures SIGPIPE of a process and pauses it.…

看到一个暴强的翻译,闲的蛋疼,写个c#版的

在豆瓣上看到一篇关于拿破仑的翻译&#xff0c;文科生的翻译有几段相当传神&#xff0c;不得不佩服汉语的强大。有好事者还用程序语言实现了一下&#xff0c;现已有java、python和html的版本&#xff0c;我也来写个渺小的C#版本&#xff0c;运行结果和java版是一致的&#xff0…

太多的想法,反而不是什么好兆头

太多的想法&#xff0c;反而不是什么好兆头&#xff0c;思绪太多&#xff0c;反而影响专心做另外一件事情&#xff01;转载于:https://blog.51cto.com/newsnews/1113359

电销会员分销

AI(人工智能)机器人:真人语音智能流畅对话&#xff0c;支持打断&#xff0c;自动录音。自动按意向分A B C D 类。代替电销人员打电话&#xff0c;减少80%的重复劳动!低成本,高效率。 web部分&#xff0c;对接机器人&#xff0c;机器人智能语言交互。对一些做电销的企业来讲节省…

raft协议中统计一条log被多少节点复制

在raft协议中&#xff0c;client的请求都会转化为一条log&#xff0c;并且只能由leader才能处理来自client的请求&#xff0c;如果一个log请求到了follower上&#xff0c;最后也会重定向到leader上的。 好的&#xff0c;废话说多了&#xff0c;开始主题&#xff1a;raft协议中…

[笔记][原创]Verilog HDL语法分析笔记

这篇帖子用于记录学习Verilog过程中的一些syntax的问题&#xff0c;会不断更新&#xff0c;有不正确的地方请各位帮忙指正:D一.Verilog 语法中的可综合性Verilog HDL 真的很强大&#xff0c;如果程序只用于仿真&#xff0c;那么几乎所有的语法和编程语句都可以使用。但如果程序…

SRV记录注册不成功的可能的原因

1.1.1 SRV记录注册不成功的可能的原因 默认情况&#xff0c;安装完活动目录就会DNS中的SRV记录就注册成功了&#xff0c;如果您在域控制器上重启Netlogon服务&#xff0c;有可能还是不能注册SRV记录到DNS服务器上&#xff0c;以下是总结的需要检查的几点。 DNS区域名字是否正确…

cast()函数

cast()函数用于将某种数据类型的表达式显式转换为另一种数据类型。 CAST()函数的参数是一个表达式&#xff0c;它包括用as关键字分隔的源值和目标数据类型。 语法&#xff1a;CAST (expression AS data_type) expression&#xff1a;任何有效的SQL Server表达式。 AS&#x…

组建内存双通道的条件

双通道要分以下两种情况&#xff1a; 1.对称双通道&#xff1a;这是最传统的双通道模式&#xff0c;需要尽量完全相同的成对内存组建&#xff0c;性能为双通道中最强&#xff0c;要求也最苛刻&#xff0c;即使不能保证内存完全相同也至少应该保证容量、速度、延时、版型相同&am…

ABAP很厉害是怎么一种体验?

知乎上偶然看到这个问题&#xff0c;觉得很有意思&#xff0c;我也来回答一发。 我本科和研究生学的是计算机专业&#xff0c;做项目用C/C&#xff0c;研究生三年项目的代码量大概在三到四万行左右。2007年大学毕业加入SAP成都研究院一直工作到现在&#xff0c;工作中用的最熟练…

vector内存扩容

vector底层实现的机制是一个动态数组&#xff0c;当其占用的内存不足时&#xff0c;就会自动分配时原来内存大小2倍的空间&#xff0c;并将原来内存中的数据拷贝到新开辟的内存中。vector扩容时&#xff0c;并不是在原有内存的基础上再分配一块内存&#xff0c;而是在其他的地方…

C语言:为什么用fprintf(stderr,Error);比printf(Error);更好?

C语言:为什么用fprintf(stderr,"Error");比printf("Error");更好?_百度知道C语言:为什么用fprintf(stderr,"Error");比printf("Error");更好?2009-05-27 17:03 提问者&#xff1a; Wave_Dan |浏览次数&#xff1a;2855次请问:当文件…

w3m 使用总结

安装 sudo apt install w3m终端 w3m www.baidu.com 即可打开w3m是个开放源代码的命令行下面的网页浏览器。一般的linux系统都会自带这个工具&#xff0c;可以通过它在命令行下面浏览网页。本文介绍这个工具的使用方法。 [功能] w3m是个开放源代码的命令行下面的网页浏览器。 它…

set_error_handler自定义错误处理

刚看到了App.class.php&#xff0c;里面有个自定义错误的函数appError 刚还在怀疑。咋这么多参数&#xff0c;虽然看起来都是有用的&#xff0c;不过有些头晕。 继续往下看&#xff0c;看到了init()里的第一句话set_error_handler(array(&$this,”appError”)); 于是好好搜…

vector查找、插入、删除时效率对比

vector底层实现的机制时动态数组&#xff0c;因此适用于查找比较频繁的场景。那么在vector的中push_back()一个元素时或者在尾部删除一个元素时&#xff0c;效率是不是就高&#xff1f; 结果&#xff1a;不是。无论在任何位置插入或者删除元素时&#xff0c;都会进行内存的分配…