目录
1、rc 级别的 mvcc 和 rr 级别的mvcc 有啥区别?
2、Innodb与MyIsam的文件结构?
3、Innodb 与MyIsam的简单对比?
4、innodb,Alter table 改字段类型,底层会经历什么过程?
5、Alter table 改字段类型 ,需要注意哪些问题?
6、Innodb 与 MyISam 主键索引与其他索引的区别?
7、mysql为什么要用b+树,不用b树?
1、rc 级别的 mvcc 和 rr 级别的mvcc 有啥区别?
ead Committed(RC)和 Repeatable Read(RR)都是支持多版本并发控制(MVCC)机制的事务隔离级别,它们之间的区别在于事务的可见性和并发性。
可见性:RC级别,只能看到其他事务提交的最新版本。RR级别可以看到新旧版本。RR可见性高。
并发性:RC级别,多个事务可以读取到同一记录的最新版本。RR级别下,多个事务可能读取到不同的版本。
场景:RC 隔离级别下的 MVCC 机制适合读多写少的场景,可以提高数据库的并发性能和可伸缩性;而 RR 隔离级别下的 MVCC 机制适合读写并发的场景,可以保证数据的一致性和可靠性。需要根据具体的业务场景和性能需求选择合适的事务隔离级别。
2、Innodb与MyIsam的文件结构?
Myism物理文件结构为:
.frm文件:与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等。
.myd文件:myisam存储引擎专用,用于存储myisam表的数据
.myi文件:myisam存储引擎专用,用于存储myisam表的索引相关信息
Innodb的物理文件结构为:
.frm文件:与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等。
.ibd文件和.ibdata文件:
这两种文件都是存放innodb数据的文件,之所以用两种文件来存放innodb的数据,是因为innodb的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是用独享表空间存放存储数据。
独享表空间存储方式使用.ibd文件,并且每个表一个ibd文件
共享表空间存储方式使用.ibdata文件,所有表共同使用一个ibdata文件
3、Innodb 与MyIsam的简单总结对比?
InnoDB 特点:
- 支持事务和外键约束。
- 支持行级锁定,可以提高并发性能。(MyIsam是表级别锁定)
- 支持崩溃恢复机制,可以保证数据的可靠性。
- 支持多版本并发控制(MVCC)机制,可以提高并发性能和可伸缩性。
- 适合于读写并发的场景,对于需要频繁更新的数据表,InnoDB 的性能比 MyISAM 更高。(MyIsam 适合于读多写少的场景,对于只读的数据表,MyISAM 的查询性能比 InnoDB 更高。)
4、innodb,Alter table 改字段类型,底层会经历什么过程?
- 创建一个新的临时表,该表的结构与原表相同,但修改了目标字段的数据类型。
- 将原表中的数据逐行复制到临时表中,同时将目标字段的数据类型进行转换。
- 在复制数据的过程中,如果发现某行数据无法转换为目标数据类型,则会将该行数据的目标字段设置为 NULL。
- 复制完成后,使用 RENAME TABLE 命令将原表重命名为备份表,将临时表重命名为原表。
- 删除备份表。
需要注意的是,如果原表中存在索引,则在修改字段类型后需要重新创建索引。
5、Alter table 改字段类型 ,需要注意哪些问题?
- db 磁盘空间可能不够,因为要新建table和索引
6、Innodb 与 MyISam 主键索引与其他索引的区别?
- innodb的主键index树的叶子节点,存放的是数据。 MyIsam存的是数据的物理地址。数据和索引放在一起,叫做聚簇index,MyIsam那种叫做非聚簇index
- innodb的其他索引树,叶子节点存的是主键id,myIsam的二级索引树,叶子节点存的和主键索引树一样,都是物理地址。(innodb数据移动的时候,二级索引的叶子节点不需要改动,因为存的是主键id,MyIsam就全部都要改动)
- innodb一定要有主键,因为二级索引存的是主键key,根据主键key再去叶子节点找数据。(InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。)
MyISam 的主键索引和二级索引
Innodb 的主键索引和二级索引树
7、mysql为什么要用b+树,不用b树?
- B+树,非叶子节点不存储数据,只存储索引,但是B树是既存了数据又存了索引。B+树可以减少磁盘 I/O 操作,提高查询性能。也可以减少锁竞争,提高并发性能。
- B+树,叶子节点之间用指针链接,B树没有。于是B+树可以支持范围查询和排序操作,也更合适内存缓存。
综上所述,B+ 树相对于 B 树具有更好的磁盘存储、范围查询、内存缓存和高并发性能,更适合作为 MySQL 的索引结构。
图1是一个简单的B-Tree。
图1
图2是一个简单的B+Tree示意。
图2