同事咨询MySQL MEMORY引擎的细节,能否满足需求。没有太多了解,这里做个系统总结。
MEMORY存储引擎创建的表数据只能保存在内存。
MEMORY 存储引擎特性
[a] Implemented in the server (via encryption functions).>服务器重启会导致内存表数据丢失。如果是主库,从库没有意识到主库表中数据已被情况,所以在从库你看到的是过期数据。
重启后,主从库如何同步内存表数据?
当主库使用内存表,主库启动后,一条DELETE语句会写入到主库的binary log中,从库接到命令后清空内存表。
主库重启期间,从库还是有读取到过期数据的情况。为了避免这种情况,主库启动时加入–init-file参数,这样主库启动自动将数据加载到内存表中。(官方文档写的不严谨,我认为仅限于内存表只读场景。如果不是只读,即使加入–init-file参数也无法保证主库内存表数据一致)。
管理内存使用情况
服务器必须有足够内存,来满足多张内存表的使用。
如果从内存表中删除单独的行,并不会回收内存。当整个内存表删除时,才回收内存。同一张内存表,之前删除行占用的空间,会被新的行复用。执行DELETE、TRUNCATE TABLE来释放内存表占用空间,如果表不在使用可使用DROP TABLE命令。释放正在使用的内存表占用的内存,可以使用 ALTER TABLE XX ENGINE=MEMORY 强制重建表。
内存表1行记录占用内存计算公式
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
服务器重启后,每个表的尺寸都变成了全局 max_heap_table_size 变量的值大小。
压测结果
通过sysbench压测,InnoDB 写性能完爆MEMORY引擎,MEMORY的读性能略高于InnoDB。InnoDB的综合性能更好,足够满足日常使用。考虑到MEMORY引擎的雷点太多,建议不使用MEMORY引擎。
如何使用mysql的API在c/c++的代码中,创建一个存储过程?
MySQL的概述MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。 在2008年1月16号被Sun公司收购。 目前MySQL被广泛地应用在Internet上的中小型网站中。 由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。 MySQL的官方网站的网址是:[编辑本段]MySQL的特性1.使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性 2.支持AIX、FreeBSD、HP-UX、Linux、Mac OS、Novell Netware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统 3.为多种编程语言提供了API。 这些编程语言包括C、C++、Eiffel、Java、Perl、PHP、Python、Ruby和Tcl等。 4.支持多线程,充分利用CPU资源 5.优化的SQL查询算法,有效地提高查询速度 6.既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中提供多语言支持,常见的编码如中文的GB 2312、BIG5,日文的Shift_JIS等都可以用作数据表名和数据列名7.提供TCP/IP、ODBC和JDBC等多种数据库连接途径 8.提供用于管理、检查、优化数据库操作的管理工具 9.可以处理拥有上千万条记录的大型数据库[编辑本段]MySQL的应用与其他的大型数据库例如Oracle、DB2、SQL Server等相比,MySQL自有它的不足之处,如规模小、功能有限(MySQL Cluster的功能和效率都相对比较差)等,但是这丝毫也没有减少它受欢迎的程度。 对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于MySQL是开放源码软件,因此可以大大降低总体拥有成本。 目前Internet上流行的网站构架方式是LAMP(Linux+Apache+MySQL+PHP),即使用Linux作为操作系统,Apache作为Web服务器,MySQL作为数据库,PHP作为服务器端脚本解释器。 由于这四个软件都是遵循GPL的开放源码软件,因此使用这种方式不用花一分钱就可以建立起一个稳定、免费的网站系统。 [编辑本段]MySQL管理可以使用命令行工具管理MySQL数据库(命令mysql 和 mysqladmin),也可以从MySQL的网站下载图形管理工具MySQL Administrator和MySQL Query Browser。 phpMyAdmin是由php写成的MySQL资料库系统管理程式,让管理者可用Web介面管理MySQL资料库。 phpMyBackupPro也是由PHP写成的,可以透过Web介面创建和管理数据库。 它可以创建伪cronjobs,可以用来自动在某个时间或周期备份MySQL 数据库。 另外,还有其他的GUI管理工具,例如早先的mysql-front 以及 ems mysql manager,navicat 等等。 [编辑本段]Mysql存储引擎MyISAM Mysql的默认数据库,最为常用。 拥有较高的插入,查询速度,但不支持事务InnoDB 事务型数据库的首选引擎,支持ACID事务,支持行级锁定BDB 源自Berkeley DB,事务型数据库的另一种选择,支持COMMIT和ROLLBACK等其他事务特性Memory 所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。 但是会占用和数据量成正比的内存空间。 并且其内容会在Mysql重新启动时丢失Merge 将一定数量的MyISAM表联合而成一个整体,在超大规模数据存储时很有用Archive 非常适合存储大量的独立的,作为历史记录的数据。 因为它们不经常被读取。 Archive拥有高效的插入速度,但其对查询的支持相对较差Federated 将不同的Mysql服务器联合起来,逻辑上组成一个完整的数据库。 非常适合分布式应用Cluster/NDB 高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。 适合数据量大,安全和性能要求高的应用CSV 逻辑上由逗号分割数据的存储引擎BlackHole 黑洞引擎,写入的任何数据都会消失,一般用于记录binlog做复制的中继另外,Mysql的存储引擎接口定义良好。 有兴趣的开发者通过阅读文档编写自己的存储引擎。 [编辑本段]Mysql最常见的应用架构单点(Single),适合小规模应用复制(Replication),适合中小规模应用集群(Cluster),适合大规模应用[编辑本段]mysql历史版本MySQL公司目前在同时开发两个版本的软件,4.1版以及5.0版。 4.1版本的代码已经发布并有望在8个月后公布最终代码。 而5.0版本的最后产品将在6个月后发布。 MySQL4.1版本中增加了不少新的性能,包括对主键的更高速度的缓存,对子查询的更好的支持,以及应网络约会网站所要求的,基于地理信息的查询。 而其同步开发的5.0版本则把目标对准了企业用户,对于4.1版本中的所有新特性,5.0版本悉数收入囊中,并且独具以下特点:对外键的良好支持;系统自动报错机制以及对存储过程的充分支持。 SQL全称是“结构化查询语言(Structured Query Language)”SQL(STructured Query Language)是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。 SQL同时也是数据库脚本文件的扩展名。 SQL是高级的非过程化编程语言,允许用户在高层数据结构上工作。 他不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统可以使用相同的SQL语言作为数据输入与管理的接口。 它以记录集合作为操作对象,所有SQL语句接受集合作为输入,返回集合作为输出,这种集合特性允许一条SQL语句的输出作为另一条SQL语句的输入,所以SQL语句可以嵌套,这使他具有极大的灵活性和强大的功能,在多数情况下,在其他语言中需要一大段程序实现的功能只需要一个SQL语句就可以达到目的,这也意味着用SQL语言可以写出非常复杂的语句。 结构化查询语言(Structured Query Language)最早是IBM的圣约瑟研究实验室为其关系数据库管理系统SYSTEM R开发的一种查询语言,它的前身是SQUARE语言。 SQL语言结构简洁,功能强大,简单易学,所以自从IBM公司1981年推出以来,SQL语言得到了广泛的应用。 如今无论是像Oracle、Sybase、Informix、SQL Server这些大型的数据库管理系统,还是像Visual Foxporo、PowerBuilder这些PC上常用的数据库开发系统,都支持SQL语言作为查询语言。 美国国家标准局(ANSI)与国际标准化组织(ISO)已经制定了SQL标准。 ANSI是一个美国工业和商业集团组织,负责开发美国的商务和通讯标准。 ANSI同时也是ISO和International Electrotechnical Commission(IEC)的成员之一。 ANSI 发布与国际标准组织相应的美国标准。 1992年,ISO和IEC发布了SQL国际标准,称为SQL-92。 ANSI随之发布的相应标准是ANSI SQL-92。 ANSI SQL-92有时被称为ANSI SQL。 尽管不同的关系数据库使用的SQL版本有一些差异,但大多数都遵循 ANSI SQL 标准。 SQL Server使用ANSI SQL-92的扩展集,称为T-SQL,其遵循ANSI制定的 SQL-92标准。 SQL语言包含4个部分: ※ 数据定义语言(DDL),例如:CREATE、DROP、ALTER等语句。 ※ 数据操作语言(DML),例如:INSERT、UPDATE、DELETE语句。 ※ 数据查询语言(DQL),例如:SELECT语句。 ※ 数据控制语言(DCL),例如:GRANT、REVOKE、COMMIT、ROLLBACK等语句。 SQL语言包括三种主要程序设计语言类别的陈述式:数据定义语言(DDL),数据操作语言(DML)及数据控制语言(DCL)。
mysql 和innodb的区别
MySQL数据库有多种存储引擎:比如:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE等等,最常见的也就是MyISAM和InnoDB了,下面主要讲解下MyISAM和InnoDB两种mysql数据库存储引擎的区别。 MyISAM引擎是一种非事务性的引擎,提供高速存储和检索,以及全文搜索能力,适合数据仓库等查询频繁的应用。 MyISAM中,一个table实际保存为三个文件,存储表定义,存储数据,存储索引。 MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另外一个引擎。 MySQL服务器中的其他非事务性存储引擎(如MyISAM)遵从不同的数据完整性范例,称之为“原子操作”。 按照事务术语,MyISAM表总能高效地工作在AUTOCOMMIT=1模式下。 原子操作通常能提供可比较的完整性以及更好的性能。 与经过优化调整的最快的事务性表相比,它的速度快3~5倍。 由于MySQL服务器支持两种范例,因而你能决定是否利用原子操作的速度更好地服务于你的应用程序,或使用事务特性。 该选择可按表进行。 InnoDB则是一种支持事务的引擎。 给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。 所以的数据存储在一个或者多个数据文件中,支持类似于Oracle的锁机制。 一般在OLTP应用中使用较广泛。 如果没有指定InnoDB配置选项,MySQL将在MySQL数据目录下创建一个名为ibdata1的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的日志文件。 InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读。 这些特色增加了多用户部署和性能。 没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。 InnoDB也支持FOREIGN KEY强制。 在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。 InnoDB是为处理巨大数据量时的最大性能设计。 它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。 InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。 InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件。 InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。 InnoDB也默认被包括在所有MySQL 5.1二进制分发版里。
初次打开mysql5.6后,怎么使用呢?
一、mysql是通过DOS命令方式操作的,所以需要让DOS能找到相关命令,就得需要做一下配置,首先我们需要指定mysql服务启动启动的文件,用到bin包下的命令,可以通过环境变量配置找到此命令,也可通过在文件中添加下面配置的方式找到此命令:[WinMySQLAdmin]# 指定mysql服务启动启动的文件Server=D:/yan_package/mysql-5.6.23-win32/bin/对上述图的参数做下解释说明:basedir:设置mysql的安装目录datadir:设置mysql数据库的数据的存放目录port: 端口号server_id: server-id值类似于IP地址:这些ID值能唯一识别复制服务器群集中的每个服务器实例,如果设置主从服务器时,每个服务器必须有一个唯一的server-id值,且不相同。 也可以在配置文件中设置mysql服务器的字符集default-character-set=gbk二、文件修改好后,进入DOS命令安装mysql服务三、启动mysql服务四、在mysql控制台下以root用户登录,默认root用户是没有密码的,直接按回车。 八、登录成功后,可以看到都有哪些数据库.补充:停止mysql的服务用net stop mysql删除mysql的服务用mysqld -remove
发表评论