MySql体系结构图
MySql插拔式的存储引擎
- 插拔式引擎式Mysql中非常优秀设计,它可以动态的卸载加载存储引擎,通过一种插件化的方式进行加载,在mysql当中有非常多的存储引擎比如:MyISAM,InnoDB,Cluster等等存储引擎。
- 在上面图片中Memory旁边有个索引Index。index索引的落地并非是MySql来实现的。是通过不同的存储引擎来实现的索引机制。
- MyISAM是MySql5.5以前默认的存储引擎,InnoDB是5.5以后的默认版本存储引擎。存储引擎是用来修饰表的,一张表有且只能有一种存储引擎来修饰它,一个数据库有很多表,每个表都可以允许使用不同的存储引擎组成,但是不推荐这也使用。然而每张表必须要有一个存储引擎存储,在我们创建表的时候它会采用默认存储引擎。
MyISAM引擎落地
- 如果一个表同时有3个你上面说的文件,则存储引擎是myisam,其中可以简单理解成这样:
- frm–表定义,是描述表结构的文件。
- MYD–\”D\”数据信息文件,是表的数据文件。
- MYI–\”I\”索引信息文件,是表数据文件中任何索引的数据树。
- 根据上图显示,假设我们有一个User表,User表是根据MyISAM引擎修饰的,它会有两个文件MYI和MYD,MYI表示索引文件,在User这张表当中所有的index索引都存储在这个文件当中,MYD当中存储的是我们的数据,然后每条数据当中都会存储我们的磁盘指针。
- 假设我们根据id索引1来查找,它会基于MYI当中的B+树去查询找,当找到我们末尾节点上的数据,该数据对应的是指针,当我们拿到指针后可以快速的去MYD上找到对应的行数据返回给我们的请求中。MyISAM当中支持创建多个MYI索引文件,会根据你创建多个索引文件生成多个B+树。
Myisam特点:
- 较快的数据插入和读取性能
- 较小的磁盘占用【相较于Innodb】
- 支持表级别的锁,不支持事务
- 数据文件与索引文件分开存储【MYD和MYI】
- Myisam的统计count方法可以通过额外的常量进行返回
InnoDB引擎
- Innodb是没有MYD文件,Innodb是采用聚集索引,innodb当中有且只有一个主键索引,其他的都是非聚集索引,聚集索引在B+树末尾的子节点上存储的是它的行记录(表当中的每一行的数据)。比如id为1,在1xx当中存储的就是(1,zhangsan等等)它的索引和数据组织了在一起,以主键的索引组织在一起,这就叫做聚集索引。
- Innodb本质上是不能没有主键的,假设你没有设置主键它默认采用roId来当主键。所以它是不可能没有主键索引。
InnoDB特点:
- 支持事务
- 行级锁
- 聚集索引
- 数据行内容与索引结构在一个文件当中【IBD】
- 外键支持,保证数据的完整性
MySQL中的myisam与Innodb的区别:
- Innodb支持事务,而MyISAM不支持事务;
- Innodb支持行级锁,而MyISAM支持表级锁;
- Innodb支持MVCC,而MyISAM不支持;
- Innodb支持外键,而MyISAM不支持;
- Innodb不支持全文索引,而MyISAM支持;
- select count(*) myisam更快,因为myisam内部维护了一个计算器,可以直接调取。