MySQL存储引擎--InnoDB,MyISAM和其他常用引擎

存储引擎就是指表的类型以及表在计算机上的存储方式。

InnoDB

MySQL的默认事务型引擎,是具有提交、回滚、崩溃恢复能力和多版本并发控制的事务安全(ACID兼容)存储引擎,也是最重要、使用最广泛的存储引擎。被设计用来处理大量的短期事务,短期事务大部分是正常提交的,很少会被回滚。
支持外键,还提供了行级锁和外键约束。
不支持FULLTEXT类型的索引,而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。
InnoDB表示基于聚簇索引(对主键查询有很高的性能)建立的。
InnoDB支持真正的热备份。
InnoDB是为处理巨大数据量时的最大性能设计,它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。
InnoDB处理死锁的方法:将持有最少行级排它锁的事务进行回滚。

MyISAM

MyISAM不支持事务和行级锁,只支持并发插入的表锁。
MyISAM对整张表加锁,而不是针对行。读取时会对需要读到的所有表加共享锁,写入时则对表加排它锁。
不支持崩溃后的安全恢复。
MyISAM中存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。
MySQL中只有MyISAM支持地理空间搜索。

InnoDB与MyISAM的区别

1、MyISAM是非事务安全的,而InnoDB是事务安全的;MyISAM 强调的是性能,查询的速度比 InnoDB 类型更快,但是不提供事务支持。InnoDB 提供事务支持事务。
2、MyISAM只支持表级锁,而InnoDB支持行级锁表级锁,默认为行级锁,行锁大幅
度提高了多用户并发操作的性能;InnoDB比较适合于插入和更新操作比较多的情况,而MyISAM则适合用于频繁查询的情况。另外,InnoDB 表的行锁也不是绝对的,如果在执行一个SQL语句时,MySQL不能确定要扫描的范围,InnoDB 表同样会锁全表;
3、MyISAM引擎不支持外键,InnoDB支持外键;
4、MyISAM:允许没有主键的表存在。InnoDB:如果没有设定主键,就会自动生成一个 6 字节的主键(用户不可见)。
5、MyISAM中存储了表的行数,InnoDB没有保存表的行数;
6、MyISAM支持全文类型索引,而InnoDB不支持全文索引(innodb 从 mysql5.6 版本开始提供对全文索引的支持);
7、索引结构不一致:
Innodb主键索引采用聚集索引,数据存储在B+树叶结点上,辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引。
MyISAM采用非聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性。

两种引擎的选择与应用场景

选择InnoDB:需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票);需要频繁的更新、删除操作的数据库;需要在线热备份;大尺寸的数据集趋向于选择InnoDB引擎,因为它故障恢复,InnoDB可以利用事务日志进行数据恢复,这会比较快;主键查询在InnoDB引擎下也会相当快,不过需要注意的是如果主键太长也会导致性能问题。

选择MyISAM:没有事务;插入不频繁,查询非常频繁(读多写少的业务);应用中执行大量select操作;做很多count 的计算;

两种引擎所使用的索引的数据结构是什么?

答案:都是B+树!
MyIASM引擎,B+树的数据结构中存储的内容实际上是实际数据的地址值。也就是说它的索引和实际数据是分开的,只不过使用索引指向了实际数据。这种索引的模式被称为非聚集索引。
Innodb引擎的索引的数据结构也是B+树,只不过数据结构中存储的都是实际的数据,这种索引有被称为聚集索引。

其他存储引擎

Memory(以前也叫HEAP)

它使用存储在内存中的内容来创建表,而且数据全部放在内存中,不需要进行磁盘I/O。Memory表的结构在重启以后会保留,但数据会丢失。Memory默认使用哈希索引,速度比使用B型树索引快。表级锁,并发写入性能较低。

BlackHole

没有实现任何存储机制,会丢弃所有插入的数据。但服务器会记录BlackHole表的日志,可用于数据复制。主要用于特殊的复制架构和日志审核,一般不推荐使用。

Archive

只支持insert和select操作,会缓存所有的写并利用zlib对插入的行进行压缩,磁盘I/O更少,每次select查询需要全表扫面。适合日志和数据采集类应用。

猜你喜欢

转载自blog.csdn.net/qq_24336773/article/details/81416537