mysql存储引擎
存储引擎的定义
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)通过存储引擎进行创建,删除,修改,查询数据。不同的存储引擎提供不同的存储机制,索引技巧,锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。
补充: mysql的核心就是存储引擎
查看存储引擎
命令: show engines (我用的navicat)
InnoDB存储引擎
mysql5.5之后默认的存储引擎,是事务型数据库的首选引擎。支持事务安全表(ACID:原子性,一致性,隔离性,持久性)
InnoDB的特性:
- 给mysql的表提供了事务处理,回滚,崩溃恢复能力,多版本并发控制的事务安全,InnoDB锁定在行级并且也在SELECT语句中提供一个类似oracle的非锁定读,这些功能增加了多用户部署和性能
- InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件)。这与MyISAM表不同,比如在MyISAM表中每个表被存放在分离的文件中
- 支持auto_increment,支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键
- InnoDB里,创建的表的表结构存储在以.frm为后缀的文件中,创建的名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件,存储在innodb_data_home_dir和innodb_data_file_path定义的表空间中
- 支持B+树索引,自适应哈希索引,fulltext索引(现在支持了),R-TREE索引(是一种空间索引的数据结构,用于对GIS数据类型创建SPATIAL索引,现在支持了) 补充: 自适应哈希索引: InnoDB引擎会实时监控表上索引的使用情况,如果认为建立hash索引可以提高效率,则自动在内存中的“自适应哈希索引缓存区”中建立hash索引(好厉害的样子)
总结: InnoDB的优势在于良好的事务处理能力,崩溃恢复能力和并发控制,缺点是读写效率较差(不包括并发写入),占用的数据空间相对较大
MyISAM存储引擎
MyISAM是基于ISAM引擎发展起来的,具有较高的插入,查询速度,但不支持事务
MyISAM的特性:
- 当把删除和更新及插入混合的时候,动态尺寸的行更少碎片
- 每个MyISAM表最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16
- BLOB和TEXT列可以被索引
- NULL被允许在索引的列中,这个值占每个键的0~1个字节
- 所有数字键值以高字节为先被存储以允许一个更高地索引压缩
- 每个MyISAM类型的表都有一个AUTO_INCREMENT的内部列,当INSERT和UPDATE操作的时候该列被更新,同时AUTO_INCREMENT列将被刷新。所以说,MyISAM类型表的AUTO_INCREMENT列更新比InnoDB类型的AUTO_INCREMENT更快(至少10%)
- 可以把数据文件和索引文件放在不同目录
- VARCHAR和CHAR列可以多达64KB
- 基于MyISAM存储引擎的表支持3种不同的存储格式。包括静态型、动态型和压缩型。其中,静态型是MyISAM的默认存储格式,它的字段是固定长度的;动态型包含变长字段,记录的长度不是固定的;压缩型需要用到myisampack工具,占用的磁盘空间较小。
- 使用MyISAM引擎创建数据库,将产生3个文件。文件的名字以表名字开始,扩展名之处文件类型:frm文件存储表定义、数据文件的扩展名为.MYD(MYData)、索引文件的扩展名时.MYI(MYIndex)
- 支持B+树索引(与InnoDB不同),fulltext索引,R-TREE索引
总结: MyISAM的优势在于占用空间小,处理速度快,缺点是不支持事务的完整性和并发性
Memory存储引擎
memory存储引擎是将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问
memory的特性:
- 每个基于MEMORY存储引擎的表实际对应一个磁盘文件,该文件的文件名与表名相同,类型为frm类型,该文件中只存储表的结构
- 数据文件,都是存储在内存中,这样有利于数据的快速处理,提高整个表的效率
- MEMORY不支持BLOB或TEXT列
- MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列的索引
- MEMORY表在所有客户端之间共享(就像其他任何非TEMPORARY表)
- 当不再需要MEMORY表的内容时,要释放被MEMORY表使用的内存,应该执行DELETE FROM或TRUNCATE TABLE,或者删除整个表(使用DROP TABLE)
- MEMORY表使用一个固定的记录长度格式
- 支持HASH和BTREE索引
总结: MEMORY用到的很少,因为它是把数据存到内存中,如果内存出现异常就会影响数据,如果重启或者关机,所有数据都会消失,因此,基于MEMORY的表的生命周期很短,一般是一次性的
功能 | InnoDB | MyISAN | Memory | Archive |
存储限制 | 64TB | 256TB | RAM | none |
支持事务 | YES | NO | NO | NO |
支持全文索引 | YES | YES | NO | NO |
支持B树索引 | YES | YES | YES | NO |
支持哈希索引 | 自适应哈希索引 | NO | YES | NO |
支持数据缓存 | YES | NO | N/A | NO |
支持外键 | YES | NO | NO | NO |
总结:
如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择
如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率
如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果
如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive
使用哪一种引擎需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能