秋招Day14 - MySQL - 存储引擎
MySQL有哪些常见的存储引擎?
InnoDB,MyISAM、MEMORY
- MySQL 5.5之前默认存储引擎是MyISAM,5.5之后默认是InnoDB
- InnoDB的哈希索引是自适应的,用户无法自行创建或修改
- InnoDB从5.6开始支持全文索引
- InnoDB支持的最小表空间略低于10MB,最大表空间取决于页面大小。
存储引擎应该怎么选择?
- 大多数情况下使用InnoDB就行了,InnoDB支持事务、支持行级锁,外键等。
- MyISAM适合读多写少的场景,因为只支持表锁不支持行级锁,不支持事务。
- MEMORY适合临时表,并且数据量不大的情况下,记录都存储在内存,所以速度很快
MyISAM和InnoDB主要有什么区别?
区别主要在是否支持行级锁和是否支持事务上。InnoDB支持行级锁和事务,适合大多数业务系统,MyISMA支持的是表级锁,不支持行级锁,查询快但是写入性能较差,适合读多写少的场景。
另外,从存储结构角度,MyISAM使用三种格式的文件存储,.frm存储表的结构,.MYD存储表的数据,MYI存储表的索引;InnoDB使用两种格式的文件存储,.frm存储表结构,.ibd存储数据和索引。
从索引类型上讲,MyISAM为非聚簇索引,索引和数据分开存储,索引保存的是数据文件的指针 /偏移量,InnoDB为聚簇索引,索引和数据不分开
从外键和主键的角度来讲,MyISAM不支持外键,可以没有主键;InnoDB支持外键,必须有主键。
InnoDB的内存结构了解吗?
InnoDB的内存结构主要分为两块,buffer pool和log pool,buffer pool主要用来缓存数据页和索引页,log pool主要用来缓存redo log,提升写入性能。
数据页的结构了解吗?
InnoDB的数据页由7部分构成,其中文件头、页头和文件尾的大小是固定的,分别为38、56和8字节,这三部分用来标记页的一些固有信息。行记录、空闲空间和页目录的大小是动态的,存储页面的实际数据内容。
名称 | 中文名 | 大小(单位:B) | 描述 |
---|---|---|---|
File Header | 文件头部 | 38 | 页的一些通用信息,包括 上一页和下一页的编号 形成双向链表 |
Page Header | 页面头部 | 56 | 数据页专有的一些信息 |
Infimum + Supermum | 最小记录和最大记录 | 26 | 两个虚拟的哨兵行记录 |
User Records | 用户真实记录 | 不确定 | 实际存储的行记录内容 |
Free Space | 空闲空间 | 不确定 | 页中尚未使用的空间 |
Page Directory | 页面目录 | 不确定 | 存储每组最大记录的页内偏移量 |
File Trailer | 文件尾部 | 8 | 校验页是否完整 |
InnoDB的buffer pool了解吗?
存储的是数据页和索引页,读的时候不必先访问磁盘,先尝试在缓存中查询,缓存中没有命中再从磁盘中读,并加载到buffer pool,可能会触发页淘汰,将不常用的页淘汰出去。
写操作不会直接写入磁盘,而是先写入buffer pool,标记为脏页,后台线程会定期刷盘
Buffer Pool的默认大小是多少?
我本机InnoDB的Buffer Pool的默认大小是128MB
InnoDB对LRU算法的优化了解吗?
最近访问的数据页不会放在LRU链表的头部,而是放在一个叫midpoint的位置。默认情况下这个位置位于LRU链表的5/8处,新读入的数据会首先放在老年代的头部,多次频繁访问之后才会被移动到Young区域防止被淘汰