MySQL存储引擎
(1):MyISAM存储引擎:不支持事务、也不支持外键,优势是访问速度快,对事务完整性没有 要求或者以select,insert为主的应用基本上可以用这个引擎来创建表
支持3种不同的存储格式,分别是:静态表;动态表;压缩表
静态表:表中的字段都是非变长字段,这样每个记录都是固定长度的,优点存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多(因为存储时会按照列的宽度定义补足空格)ps:在取数据的时候,默认会把字段后面的空格去掉,如果不注意会把数据本身带的空格也会忽略。
动态表:记录不是固定长度的,这样存储的优点是占用的空间相对较少;缺点:频繁的更新、删除数据容易产生碎片,需要定期执行OPTIMIZE TABLE或者myisamchk-r命令来改善性能
压缩表:因为每个记录是被单独压缩的,所以只有非常小的访问开支
(2)InnoDB存储引擎*
该存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM引擎,写的处理效率会差一些,并且会占用更多的磁盘空间以保留数据和索引。
InnoDB存储引擎的特点:支持自动增长列,支持外键约束
(3)MEMORY存储引擎
Memory存储引擎使用存在于内存中的内容来创建表。每个memory表只实际对应一个磁盘文件,格式是.frm。memory类型的表访问非常的快,因为它的数据是放在内存中的,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会丢失掉。
MEMORY存储引擎的表可以选择使用BTREE索引或者HASH索引,两种不同类型的索引有其不同的使用范围
Hash索引优点:
Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。
Hash索引缺点: 那么不精确查找呢,也很明显,因为hash算法是基于等值计算的,所以对于“like”等范围查找hash索引无效,不支持;
Memory类型的存储引擎主要用于哪些内容变化不频繁的代码表,或者作为统计操作的中间结果表,便于高效地对中间结果进行分析并得到最终的统计结果,。对存储引擎为memory的表进行更新操作要谨慎,因为数据并没有实际写入到磁盘中,所以一定要对下次重新启动服务后如何获得这些修改后的数据有所考虑。
官方存储引擎的特点对比:
特性 | MyISAM | InnoDB | Memory | Archive | NDB | BDB |
---|---|---|---|---|---|---|
存储限制 | No | 64TB | Yes | No | Yes | No |
事务 | √ | √ | ||||
MVCC | √ | √ | √ | |||
锁粒度 | Table | Row | Table | Row | Row | Page |
B树索引 | √ | √ | √ | √ | √ | |
哈希索引 | √ | √ | √ | |||
全文索引 | √ | 5.6支持e文 | ||||
集群索引 | √ | |||||
数据缓存 | √ | √ | √ | |||
索引缓存 | √ | √ | √ | √ | ||
数据压缩 | √ | √ | ||||
批量插入 | 高 | 相对低 | 高 | 非常高 | 高 | 高 |
内存消耗 | 低 | 高 | 中 | 低 | 高 | 低 |
外键支持 | √ | |||||
复制支持 | √ | √ | √ | √ | √ | √ |
查询缓存 | √ | √ | √ | √ | √ | √ |
备份恢复 | √ | √ | √ | √ | √ | √ |
集群支持 | √ |
TokuDB:支持数据压缩,支持高速写入的一个引擎,但是不适合update多的场景
Infobright/InfiniDB:基于列存储的引擎,适用于OLAP环境,Infobright社区版只支持load data操作
选择存储引擎及建议:根据不同的业务去选择适合业务的存储引擎,MySQL的存储引擎很多,不同的库,不同的表都支持选择不同的存储引擎,推荐同一个库用同一种存储引擎,因为不同存储引擎的表之间join操作比较慢
常用推荐:Innodb,非特殊的场景,Innodb存储引擎一般都可以满足需求
如果有大数据写入批量读取操作:TokuDB
针对OLAP可以考虑使用InfiniDB/Infobright
如果针对数据量小要求速度快,无持久化要求:Memory
尽量不要选择MyISAM存储引擎:因为MyISAM存储引擎只能用的单个CPU,内存只能用到4个G,内存里只有索引,而且并发能力差。
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">