关于mysql内存表的一个帖子(转载)

地址:http://bbs.csdn.net/topics/360030699

引用楼主 zgycsmb 的回复:
问:
1mysql的内存表性能怎么样
2mysql的内存表与system v 这种共享内存机制比起来,如何
3 mysql的内存表怎么用,能不能给个例子,

thanks

1mysql的内存表性能怎么样

内存表的性能是非常好的,但是取决于你的内存容量,另外它有一个比较致命的弱点,就是一旦出现系统崩溃的情况就会导致数据丢失。
2mysql的内存表与system v 这种共享内存机制比起来,如何

这个没比较过, Unix 环境中 System V 进程间通信(IPC)包括3种机制:消息队列、信号量、共享内存。消息队列和信号量均是内核空间的系统对象,经由它们的数据需要在内核和用户空间进行额外的数据拷贝;而共享内存和访问它的所有应用程序均同处于用户空间,应用进程可以通过地址映射的方式直接读写内存,从而获得非常高的通信效率。
3 mysql的内存表怎么用,能不能给个例子


MySql 内存表使用
内存表使用哈希散列索引把数据保存在内存中,因此具有极快的速度,适合缓存中小型数据库,但是使用上受到一些限制,以下是蓝草使用的一些感受。
1、heap对所有用户的连接是可见的,这使得它非常适合做缓存。
2、仅适合使用的场合。heap不允许使用xxxTEXT和xxxBLOB数据类型;只允许使用=和<=>操作符来搜索记录(不允许<、>、<=或>=);不支持auto_increment;只允许对非空数据列进行索引(not null)。
注:操作符 “<=>” 说明:NULL-safe equal.这个操作符和“=”操作符执行相同的比较操作,不过在两个操作码均为NULL时,其所得值为1而不为NULL,而当一个操作码为NULL时,其所得值为0而不为NULL。
3、一旦服务器重启,所有heap表数据丢失,但是heap表结构仍然存在,因为heap表结构是存放在实际数据库路径下的,不会自动删除。重启之后,heap将被清空,这时候对heap的查询结果都是空的。
4、如果heap是复制的某数据表,则复制之后所有主键、索引、自增等格式将不复存在,需要重新添加主键和索引,如果需要的话。
5、对于重启造成的数据丢失,有以下的解决办法:
a、在任何查询之前,执行一次简单的查询,判断heap表是否存在数据,如果不存在,则把数据重新写入,或者DROP表重新复制某张表。这需要多做一次查询。不过可以写成include文件,在需要用该heap表的页面随时调用,比较方便。
b、对于需要该heap表的页面,在该页面第一次且仅在第一次查询该表时,对数据集结果进行判断,如果结果为空,则需要重新写入数据。这样可以节省一次查询。
c、更好的办法是在mysql每次重新启动时自动写入数据到heap,但是需要配置服务器,过程比较复杂,通用性受到限制。
蓝草目前采用的是第二种办法。
6、一些预期可能用到的sql语句
//如果表存在,则删除
DROP TABLE IF EXISTS `abc`;
//复制整张表xyz为heap表abc(包含所有数据)
CREATE TABLE `abc` type=heap select * from `xyz`;
//添加主键id
ALTER TABLE `abc` ADD PRIMARY KEY (`id`);
//添加索引username
ALTER TABLE `abc` ADD INDEX `abc` (`username`);
7.建表实例
CREATE TABLE `DB` (
`id` int(11) default NULL,
`songname` varchar(255) NOT NULL default '',
`singer` varchar(255) NOT NULL default '',
KEY `songname` (`songname`,`singer`)
) TYPE=HEAP建表时TABLE TYPE 选项也有这个表结构就是建立了内存表。如果MYSQL重启 那内存表的数据 将会消失。但访问速度会很快!
几个关键参数
max_heap_table_size
mysql HEAP MEMORY tables 提高行数支持的方法
别人问到的 记一下
mysql MEMORY tables 如果目前支持的行数到上限还不够用 可以把 my.conf 配置里面
max_heap_table_size = 256M
改大
设置 MAX_ROWS
在跑着 可以 ALTER TABLE tbl_name MAX_ROWS=
MAX_ROWS 依赖于 max_heap_table_size 设置
我的配置文件
my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
port=5004
tmp_table_size=1000M
max_heap_table_size=950M
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
default-character-set=utf8
default-collation=utf8_bin
[mysql.server]
user=mysql
basedir=/var/lib
[mysqld_safe]
default-character-set=utf8
default-collation=utf8_bin
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
#default-character-set=utf8

看MySQL参考手册 发现CREATE TABLE 时有多种数据库存储引擎:
TYPE = {BDB | HEAP | ISAM | InnoDB | MERGE | MRG_MYISAM | MYISAM }
MySQL数据库引擎ISAM,myISAM,heap2007-07-20 23:40如果你是个赛车手并且按一下按钮就能够立即更换引擎而不需要把车开到车库里去换,那会是怎么感觉呢?MySQL数据库为开发人员所做的就好像是按按钮换引擎;它让你选择数据库引擎,并给你一条简单的途径来切换它。
MySQL的自带引擎肯定是够用了,但是在有些情况下,其他的引擎可能要比手头所用更适合完成任务。如果愿意的话,你甚至可以使用MySQL++ API来创建自己的数据库引擎,就像打穿气缸装上自己的化油器。现在让我们来看看你该如何选择引擎,以及如何在可用引擎之间切换。
选择你的引擎
你能用的数据库引擎取决于MySQL在安装的时候是如何被编译的。要添加一个新的引擎,就必须重新编译MySQL。仅仅为了添加一个特性而编译应用程序的概念对于Windows的开发人员来说可能很奇怪,但是在UNIX世界里,这已经成为了标准。在缺省情况下,MySQL支持三个引擎:ISAM、MyISAM和HEAP。另外两种类型InnoDB和Berkley(BDB),也常常可以使用。
ISAM
ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MySQL能够支持这样的备份应用程序。
MyISAM
MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操作。其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMChk工具和用来恢复浪费空间的MyISAMPack工具。
MyISAM强调了快速读取操作,这可能就是为什么MySQL受到了Web开发如此青睐的主要原因:在Web开发中你所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和Internet平台提供商(Internet Presence Provider,IPP)只允许使用MyISAM格式。
HEAP
HEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MyISAM都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。要记住,在用完表格之后就删除表格。让我再重复一遍:在你用完表格之后,不要忘记删除表格。
InnoDB和Berkley DB
InnoDB和Berkley DB(BDB)数据库引擎都是造就MySQL灵活性的技术的直接产品,这项技术就是MySQL++ API。在使用MySQL的时候,你所面对的每一个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理也不支持外来键。尽管要比ISAM和MyISAM引擎慢很多,但是InnoDB和BDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,如果你的设计需要这些特性中的一者或者两者,那你就要被迫使用后两个引擎中的一个了。
如果感觉自己的确技术高超,你还能够使用MySQL++来创建自己的数据库引擎。这个API为你提供了操作字段、记录、表格、数据库、连接、安全帐号的功能,以及建立诸如MySQL这样DBMS所需要的所有其他无数功能。深入讲解API已经超出了本文的范围,但是你需要了解MySQL++的存在及其可交换引擎背后的技术,这一点是很重要的。估计这个插件式数据库引擎的模型甚至能够被用来为MySQL创建本地的XML提供器(XML provider)。(任何读到本文的MySQL++开发人员可以把这一点当作是个要求。)
按开关
让所有的灵活性成为可能的开关是提供给ANSI SQL的MySQL扩展——TYPE参数。MySQL能够让你在表格这一层指定数据库引擎,所以它们有时候也指的是table formats。下面的示例代码表明了如何创建分别使用MyISAM、ISAM和HEAP引擎的表格。要注意,创建每个表格的代码是相同的,除了最后的TYPE参数,这一参数用来指定数据引擎。
CREATE TABLE tblMyISAM (
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id),
value_a TINYINT
) TYPE=MyISAM
CREATE TABLE tblISAM (
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id),
value_a TINYINT
) TYPE=ISAM
CREATE TABLE tblHeap (
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id),
value_a TINYINT
) TYPE=Heap
你也可以使用ALTER TABLE命令,把原有的表格从一个引擎移动到另一个引擎。下面的代码显示了如何使用ALTER TABLE把MyISAM表格移动到InnoDB的引擎:
ALTER TABLE tblMyISAM CHANGE TYPE=InnoDB
MySQL用三步来实现这一目的。首先,这个表格的一个副本被创建。然后,任何输入数据的改变都被排入队列,同时这个副本被移动到另一个引擎。最后,任何排入队列的数据改变都被送交到新的表格里,而原来的表格被删除。
--------------------------------------------------------------------------------
ALTER TABLE捷径
如果只是想把表格从ISAM更新为MyISAM,你可以使用mysql_convert_table_format命令,而不需要编写ALTER TABLE表达式。
--------------------------------------------------------------------------------
你可以使用SHOW TABLE命令(这是MySQL对ANSI标准的另一个扩展)来确定哪个引擎在管理着特定的表格。SHOW TABLE会返回一个带有多数据列的结果集,你可以用这个结果集来查询获得所有类型的信息:数据库引擎的名称在Type字段里。下面的示例代码说明了SHOW TABLE的用法:
SHOW TABLE STATUS FROM tblInnoDB
--------------------------------------------------------------------------------
SHOW TABLE的替换方法
你可以用SHOW CREATE TABLE [TableName]来取回SHOW TABLE能够取回的信息。
--------------------------------------------------------------------------------
最后,如果你想使用没有被编译成MySQL也没有被激活的引擎,那是没有用的,MySQL不会提示这一点。而它只会给你提供一个缺省格式(MyISAM)的表格。除了使用缺省的表格格式外,还有办法让MySQL给出错误提示,但是就现在而言,如果不能肯定特定的数据库引擎是否可用的话,你要使用SHOW TABLE来检查表格格式。
更多的选择意味着更好的性能
用于特定表格的引擎都需要重新编译和追踪,考虑到这种的额外复杂性,为什么你还是想要使用非缺省的数据库引擎呢?答案很简单:要调整数据库来满足你的要求。
可以肯定的是,MyISAM的确快,但是如果你的逻辑设计需要事务处理,你就可以自由使用支持事务处理的引擎。进一步讲,由于MySQL能够允许你在表格这一层应用数据库引擎,所以你可以只对需要事务处理的表格来进行性能优化,而把不需要事务处理的表格交给更加轻便的MyISAM引擎。对于MySQL而言,灵活性才是关键。

转载于:https://www.cnblogs.com/lit10050528/p/4222217.html

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

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

相关文章

Python爬取网页

参考&#xff1a; https://www.cnblogs.com/xiao-apple36/p/8433400.html

2019数字化趋势:未来5年政府、零售数字化程度将达80%

来源&#xff1a;阿里云摘要&#xff1a;2月20日&#xff0c;阿里云研究中心发布《2019数字化趋势报告》。报告指出&#xff0c;当前数字化的应用领域正从互联网行业向政府、金融、零售、农业、工业、交通、物流、医疗健康等行业深入。其中&#xff0c;政府、零售业等将成为受云…

MySql 表分区

http://www.cnblogs.com/acpp/archive/2010/08/09/1795464.html转载于:https://www.cnblogs.com/gaobing/p/4224677.html

QT中读写.ini配置文件的操作

ini 文件(即Initialization file)&#xff1a;这种类型的文件中通常存放的是一个程序的初始化信息。ini文件由若干个节(Section)组成&#xff0c;每个Section由若干键(Key)组成&#xff0c;每个Key可以赋相应的值。 //...添加头文件 #include <QSettings> //读写ini文件…

量子计算何时具有真正的商业价值?

来源&#xff1a;IEEE电气电子工程师学会我们对新技术的迷恋似乎总是遵循着同样的轨迹&#xff1a;我们时而着迷&#xff0c;时而崇拜&#xff0c;时而失望&#xff0c;时而沮丧&#xff0c;最终得到的满足比我们最初想象的要少。1954年&#xff0c;德州仪器公司宣称其新型晶体…

[转帖]FPGA--Vivado

来源&#xff1a;http://home.eeworld.com.cn/my/space-uid-639749-blogid-267593.html 一般的&#xff0c;在Verilog中最常用的编码方式有二进制编码(Binary)、格雷码(Gray-code)编码、独热码(One-hot)编码。二进制码和格雷码是压缩状态编码。 若使用格雷编码&#xff0c;则相…

国内5G工程建设面临的6大挑战

来源&#xff1a;5G产业圈摘要&#xff1a;2019年被很多人认为是5G建设元年&#xff0c;但是&#xff0c;5G建设要面临的这些难题&#xff0c;你清楚几个&#xff1f;1、网络云化带来的规划和运维挑战5G网络全面云化&#xff0c;在带来功能灵活性的同时&#xff0c;也带来很多技…

QT中的滚动条QScrollArea

QT里的滚动条操作&#xff0c; 我理解的QScrollArea对象的使用为&#xff0c;把某个widget绑定到该QScrollArea对象&#xff0c;scrol->setWidget(widget); 绑定的widget对象的长宽超过边界时&#xff0c;会有滚动条的效果。 #include <QtGui/QApplication> #include…

iis5.1/6.0/7.0+ 配置url重写 无扩展名伪静态

最近在搞url重写 遇到iis 无扩展名及html映射问题 供后人查看 因为考虑功能比较多(URLRewriter组件有些功能满足不了要求)所以就用了HttpModule方法重写 iis5.1中 添加应用程序映射 .* (注意 这种方法只有5.1中可以)到 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_i…

无人驾驶重塑竞争生态圈

来源&#xff1a;智车科技摘要&#xff1a;中国有可能成为L4技术以及相关应用的世界领导者&#xff1b;在2030年&#xff0c;中国极有可能成为世界最大的无人驾驶市场&#xff1b;无人驾驶L4生态会是“共生”的&#xff0c;价值链将趋向扁平化&#xff1b;传统汽车领城的公司需…

套接字介绍

1.套接字 套接字是通信双方在通信时所使用的通信点&#xff08;Endpoint&#xff09;&#xff0c;通信双方通过通信点来交换信息和数据。 当一个进程想和另一个进程进行网络通信时&#xff0c;它必须知道另外一个进程所在的目标机器的IP地址&#xff0c;同时也必须有一种机制来…

python 发送邮件附件及文字信息

一&#xff0c;发送附件 1 #!/usr/bin/python2 # -*- coding: utf-8 -*-3 def smtp(file):4 from email.mime.text import MIMEText5 from email.mime.multipart import MIMEMultipart6 import smtplib7 8 msgMIMEMultipart()9 10 #构造附件1 11 …

5G的3大应用场景落地开花,中国或将引领全球5G产业发展

来源&#xff1a;易观智库摘要&#xff1a;2019年2月11日&#xff0c;易观发布了《中国5G应用市场数字化专题2018》的专题分析。5G是指“第五代移动通信计划”&#xff0c;不同于以往通信计划的更迭主要在于提升数据传输速率&#xff0c;5G的网络特点强调数据传输速率的提升、降…

git的一些命令

git revert是用一次新的commit来回滚之前的commit&#xff0c; git reset是直接删除指定的commit

一个简单的parser

所有的内容基于《两周自制脚本语言》。 原文中使用Java编写。鉴于本人不怎么会写Java&#xff08;书里面有好奇怪的语法&#xff0c;不懂&#xff08;逃&#xff09;&#xff09;&#xff0c;便用C#写了一个简单的parser。 代码输入格式&#xff1a; 1: i23*3/(4-2)2: i1; if(i…

向机器理解人类行为迈出一小步

一名被试人员正在键盘上打字来源&#xff1a;《中国科学报》摘要&#xff1a;近日&#xff0c;《中国科学报》采访了CCF优秀博士学位论文奖获奖者、清华大学博士易鑫及其导师史元春教授&#xff0c;深入报道了他们对人机自然交互研究的最新进展。随着信息技术的发展&#xff0c…

LPCTSTR类型介绍

参考&#xff1a;https://www.xuebuyuan.com/1182742.html

Centos环境下删除Oracle11g客户端文档

将安装目录删除 [rootOracle /root]# rm -rf /opt/oracle/ 将/usr/bin下的文件删除[rootOracle /root]# rm /usr/local/bin/dbhome[rootOracle /root]# rm /usr/local/bin/oraenv [rootOracle /root]# rm /usr/local/bin/coraenv 将/etc/oratab删除[rootOracle /root]# rm /etc…

邬贺铨院士:工业互联网ICT的新挑战来(附PPT照片)

来源&#xff1a;走向智能论坛摘要&#xff1a;2月21日&#xff0c;由中国信息通信研究院、工业互联网产业联盟、中国通信学会联合主办的2019工业互联网峰会在北京召开。中国工程院院士邬贺铨做题为“工业互联网ICT的新挑战”的主旨演讲。尊敬的苗部长、赵院长、张总&#xff0…

QT中border-image的解释

参考&#xff1a;https://blog.csdn.net/foreverling_ling/article/details/52247649