MySQL数据库是程序员在开发软件的时候会经常用到的数据库类型之一,而本文我们就通过案例分析来了解一下,MySQL数据库存储引擎类型都有哪些。
InnoDB存储引擎:从MySQL5.5版本之后,MySQL的默认内置存储引擎已经是InnoDB了,他的主要特点有:
InnoDB是MySQL5.5之后默认的数据库存储引擎,支持事务,支持外键
使用共享表空间存储:所有的表和索引存放在同一个表空间中。
使用多表空间存储:表结构放在frm文件,数据和索引放在IBD文件中。分区表的话,每个分区对应单独的IBD文件,分区表的定义可以查看我的其他文章。使用分区表的好处在于提升查询效率。
灾难恢复性比较好;
支持事务。默认的事务隔离级别为可重复度,通过MVCC(并发版本控制)来实现的。
使用的锁粒度为行级锁,可以支持更高的并发;
支持外键;
配合一些热备工具可以支持在线热备份,有很成熟的在线热备解决方案;
在InnoDB中存在着缓冲管理,通过缓冲池,将索引和数据全部缓存起来,加快查询的速度;
对于InnoDB类型的表,其数据的物理组织形式是聚簇表。所有的数据按照主键来组织。数据和索引放在一块,都位于B+数的叶子节点上;
MyISAM存储引擎:在5.5版本之前,MyISAM是MySQL的默认存储引擎,该存储引擎并发性差,不支持事务,所以使用场景比较少,主要特点为:
MyISAM是MySQL5.5之前的默认存储引擎,MyISAM既不支持事务,也不支持外键
每个MyISAM在磁盘上存储成3个文件索引的结构是B+树结构其文件名都和表名相同,但拓展名分别是:
frm文件:存储表的定义数据,可以存放在不同的目录,平均分布IO,获得更快的速度
MYD文件:存放表具体记录的数据,可以存放在不同的目录,平均分布IO,获得更快的速度
MYI文件:存储索引,仅保存记录所在页的指针
通过MYI的B+树结构来查找记录页,再根据记录页查找记录。并且支持全文索引、B树索引和数据压缩,支持数据的类型有以下三种
静态固定长度表
动态可变长表
压缩表
不支持事务;
不支持外键,如果强行增加外键,不会提示错误,只是外键不起作用;
对数据的查询缓存只会缓存索引,不会像InnoDB一样缓存数据,而且是利用操作系统本身的缓存;
默认的锁粒度为表级锁,所以并发度很差,加锁快,锁冲突较少,所以不太容易发生死锁;
支持全文索引(MySQL5.6之后,InnoDB存储引擎也对全文索引做了支持),但是MySQL的全文索引基本不会使用,对于全文索引,现在有其他成熟的解决方案,比如:ElasticSearch,Solr,Sphinx等。
数据库所在主机如果宕机,MyISAM的数据文件容易损坏,而且难恢复;
查询性能上,MyISAM的查询效率高于InnoDB,因为InnoDB在查询过程中,是需要维护数据缓存,而且查询过程是先定位到行所在的数据块,然后在从数据块中定位到要查找的行;而MyISAM可以直接定位到数据所在的内存地址,可以直接找到数据;
SELECTCOUNT(*)语句,如果行数在千万级别以上,MyISAM可以快速查出,而InnoDB查询的特别慢,因为MyISAM将行数单独存储了,而InnoDB需要朱行去统计行数;所以如果使用InnoDB,而且需要查询行数,则需要对行数进行特殊处理,如:离线查询并缓存;