mysql的存储引擎知识详解
关系表是用于存储和组织信息的数据结构,可以将表理解为由行和列组成的表格,类似于excel的电子表格的形式。有的表简单,有的表复杂,有的表根本不用来存储任何长期的数据,有的表读取时非常快,但是插入数据时去很差;而我们在实际开发过程中,就可能需要各种各样的表,不同的表,就意味着存储不同类型的数据,数据的处理上也会存在着差异,那么。对于mysql来说,它提供了很多种类型的存储引擎(或者说不通的表类型),我们可以根据对数据处理的需求,选择不同的存储引擎,从而最大限度的利用mysql强大的功能。
mysql中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。
这些不同的技术以及配套的相关功能在 mysql中被称作存储引擎(也称作表类型)。 mysql默认配置了许多不同的存储引擎,可以预先设置或者在mysql服务器中启用。你可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最大的灵活性。
innodb
innodb 是 mysql 默认的事务型存储引擎,只有在需要 innodb 不支持的特性时,才考虑使用其它存储引擎。
采用 mvcc 来支持高并发,并且实现了四个标准的隔离级别,默认级别是可重复读。
表是基于聚簇索引建立的,它对主键的查询性能有很高的提升。
内部做了很多优化,包括从磁盘读取数据时采用的可预测性读、能够自动在内存中创建哈希索引以加速读操作的自适应哈希索引、能够加速插入操作的插入缓冲区等。
通过一些机制和工具支持真正的热备份。
myisam
myisam 提供了大量的特性,包括全文索引、压缩、空间函数(gis)等。但 myisam 不支持事务和行级锁,而且崩溃后无法安全恢复。
只能对整张表加锁,而不是针对行。
可以手工或者自动执行检查和修复操作,但是和事务恢复以及崩溃恢复不同,可能导致一些数据丢失,而且修复操作是非常慢的。
可以包含动态或者静态的行。
如果指定了 delay_key_write 选项,在每次修改执行完成时,不会立即将修改的索引数据写入磁盘,而是会写到内存中的键缓冲区,只有在清理键缓冲区或者关闭表的时候才会将对应的索引块写入磁盘。这种方式可以极大的提升写入性能,但是在数据库或者主机崩溃时会造成索引损坏,需要执行修复操作。
如果表在创建并导入数据以后,不会再进行修改操作,那么这样的表适合采用 myisam 压缩表。
对于只读数据,或者表比较小、可以容忍修复操作,则依然可以继续使用 myisam。
myisam 设计简单,数据以紧密格式存储,所以在某些场景下性能很好。
比较
事务:innodb 是事务型的。
备份:innodb 支持在线热备份。
崩溃恢复:myisam 崩溃后发生损坏的概率比 innodb 高很多,而且恢复的速度也更慢。
并发:myisam 只支持表级锁,而 innodb 还支持行级锁。
其它特性:myisam 支持全文索引,地理空间索引。