MySQL读书笔记--存储引擎的选择

本文介绍了MySQL的多种存储引擎,包括默认引擎MyISAM的特点及三种存储格式:静态表、动态表和压缩表;InnoDB引擎支持事务安全和外键约束;MEMORY引擎用于内存表创建,适用于变化不频繁的数据;MERGE引擎作为MyISAM表的组合使用;以及第三方存储引擎TokuDB的特性。文章还讨论了如何根据应用特点选择合适的存储引擎。
1 MySQL存储引擎

  和大多数数据库不同,MySQL数据库是最重要的存储引擎的概念,针对不同的存储需求可以选择不同的存储引擎.

2.1 MyISAM

  MySQL的默认存储引擎,不支持事务,也不支持外键,其优势是访问速度快.

  MyISAM支持3种不同的存储格式:静态表,动态表,压缩表.

  其中静态表是默认的存储方式.每个字段都是非变长字段,每个记录都是固定长度的.优点是存储非常迅速,容易缓存,出现故障容易修复,缺点是占用空间比动态表大,会对数据自动补空格,但是访问也访问不到,但是若存储的数据尾部是空格的话,再访问该条数据也会丢失空格;
  动态表包括变长字段,记录不是固定长度的,优点是占空间相对较小,但是频繁更新删除会产生碎片,需要定期的执行OPTIMIZE语句或者myisamchk-r命令来改善性能,并且在出现故障时恢复较难;

  压缩表由myisampack创建,占用非常小的磁盘空间.

2.2 InnoDB
  InnoDB存储引擎提供了具有提交,回滚和崩溃恢复能力的事务安全.速度比MyISAM慢. 
特点:
  (1)自动增长列
  自动增长列可以手工插入,但是插入的值是空或者是0时,实际插入的值是自动增长后的值.
  (2)外键约束
  MySQL支持外间的存储引擎只有InnoDB
  (3)存储方式
  InnoDB存储表和索引有以下两种方式
  使用共享表空间存储
  使用多表空间存储

7.2.3 MEMORY
  MEMORY存储引擎使用存在于内存中的内容来创建表,每个MEMORY表只实际对应一个磁盘文件,格式是.frm.MEMORY类型的表访问数据非常的快,因为他的数据是存放在内存中的,并且默认使用HASH索引,也可以指定使用BTREE索引.主要用于那些内容变化不频繁的代码表,便于高效的对中间结果进行分析并得到最终的统计结果,对MEMORY表的数据更新要谨慎,因为数据没有写到磁盘中,而是在内存里,所以一定要对重启服务后如何获得这些修改后的数据有所考虑.

7.2.4 MERGE
  MERGE存储引擎是一组MyISAM表的组合,这些MyISAM表结果必须完全相同,MERGE表本身并没有数据,对MERGE类型的表进行增改查的时候都是对内部的表的操作,删除操作DROP删除的是MERGE表的定义,对内部表无影响,对于MERGE类型的表的插入操作是INSERT_METHOD字句定义插入的表,有三个值,FIRST,LAST和NO,不写和NO一样,就不能对表进行插入操作.

7.2.5 TokuDB
  前面介绍的都是MySQL自带的存储引擎,除此之外还有一些第三方存储引擎,比如列式存储引擎infobright,高写性能的压缩的TokuDB就是其中有代表性的两种
  TokuDB是一个高性能,支持事务处理的MySQL和MariaDB的存储引擎,具有高扩展性,高压缩率,高效的写入性能,支持大多数的在线DDL操作.
特性:
(1)使用Fractal数索引保证高效的插入的性能;
(2)优秀的压缩特性,比InnoDB高近10倍;
(3)Hot Schema Changes特性支持在线创建索引和添加,删除属性列等DDL操作.
(4)使用Bulk Loader达到快速加载大量数据;
(5)提供了主从延迟消除技术
(6)支持ACID和MVCC

3 如何选择合适的存储引擎
  在选择存储引擎时,应根据应用特点选择合适的存储引擎.对于复杂的应用程序,还可以根据实际情况选择多种存储引擎进行组合.
已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 QueueForMcu 基于单片机实现的队列功能模块,主要用于8位、16位、32位非运行RTOS的单片机应用,兼容大多数单片机平台。 开源代码:https://.com/xiaoxinpro/QueueForMcu 一、特性 动态创建队列对象 动态设置队列数据缓冲区 静态指定队列元素数据长度 采用值传递的方式保存队列数据 二、快速使用 三、配置说明 目前QueueForMcu只有一个静态配置项,具体如下: 在文件 中有一个宏定义 用于指定队列元素的数据长度,默认是 ,可以根据需要更改为其他数据类型。 四、数据结构 队列的数据结构为 用于保存队列的状态,源码如下: 其中 为配置项中自定义的数据类型。 五、创建队列 1、创建队列缓存 由于我们采用值传递的方式保存队列数据,因此我们在创建队列前要手动创建一个队列缓存区,用于存放队列数据。 以上代码即创建一个大小为 的队列缓存区。 2、创建队列结构 接下来使用 创建队列结构,用于保存队列的状态: 3、初始化队列 准备好队列缓存和队列结构后调用 函数来创建队列,该函数原型如下: 参数说明: 参考代码: 六、压入队列 1、单数据压入 将数据压入队列尾部使用 函数,该函数原型如下: 参数说明: 返回值说明: 该函数会返回一个 枚举数据类型,返回值会根据队列状态返回以下几个值: 参考代码: 2、多数据压入 若需要将多个数据(数组)压入队列可以使用 函数,原理上循环调用 函数来实现的,函数原型如下: 参数说明: 当数组长度大于队列剩余长度时,数组多余的数据将被忽略。 返回值说明: 该函数将返回实际被压入到队列中的数据长度。 当队列中的剩余长度富余...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值