MySQL 的存储引擎是插件式的,不同的存储引擎有不同的锁机制,其中我们最常到的两个存储引擎为 MyISAM 与 InnoDB。
MyISAM 与 InnoDB的区别:
MyISAM:
-
不支持事务,但是每次查询都是原子的;
-
支持表级锁,即每次操作是对整个表加锁;
-
存储表的总行数;
-
一个 MYISAM 表有三个文件:索引文件、表结构文件、数据文件;
-
采用菲聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引 基本一致,但是辅索引不用保证唯一性。
InnoDB:
-
支持 ACID 的事务,支持事务的四种隔离级别;
-
支持行级锁及外键约束:因此可以支持写并发;
-
不存储总行数:一个 InnoDb 引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里),也有可能为多个(设置为独立表空,表大小受操作系统文件大小限制,一般为 2G),受操作系统文件大小的限制;
-
主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引;最好使用自增主键,防止插入数据时,为维持 B+树结构,文件的大调整。
下面这个图可能更直观些:
MyISAM 与 InnoDB的索引实现:
MyISAM 的索引是非聚簇索引。索引文件和数据文件是分离的,底层是B+树作为索引结构,叶子节点data存放的是数据记录指针的地址,这种索引结构为非聚簇索引。
myisam中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。结构如下图:
InnoDB 的索引是聚簇索引。与MyISAM 的区别就是InnoDB的数据文件就是索引文件,叶子节点data存放的是数据的整条记录。这种索引结构为聚簇索引。
结构如下图:
因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有)
-
如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择其作为聚集索引。
-
如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键
-
如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。(隐含字段)
MyISAM 与 InnoDB的区别适用场景:
MyISAM 适合的场景为:
-
需要频繁执行全表 count 语句
-
对数据进行增删改的频率不高,查询非常频繁
-
没有事务
-
MyISAM 使用的索引是非聚簇索引
InnoDB 适合的场景为:
-
数据增删改查都比较频繁
-
可靠性要求高,需要支持事务
-
使用聚簇索引
……………分割线……………
不积跬步,无以至千里;不积小流,无以成江海。
关注我,每天分享一些小知识点。分享自己的小心得,包含但不限于初、中、高级面试题呦!!!
我都墨迹这么半天了 ,你不点关注,不点赞,不收藏,还不转发,你想干啥!!!!
网友评论