01、查询缓存
把数据以KV的形式放到内存里面,可以加快读取。但是MySQL的默认缓存是关闭的。
为什么MySQL不推荐使用它自带的缓存呢?
第一:要求SQL语句很严格,必须要一模一样。
第二:表里面的任何数据发生变化的时候,缓存都会失效。对大量数据的更新不适合。
02、存储引擎
MyISAM、InnoDB、Memory、CSV、Archive
MyISAM的特点如下:
支持表级别的锁(插入和更新会锁表)。不支持事务。
拥有较高的插入(insert)和查询(select)速度。
存储了表的行数(count速度更快)。
InnoDB的特点
支持事务,支持外键,因此数据的完整性、一致性更高。
支持行级别的锁和表级别的锁。
支持读写并发,写不阻塞读(MVCC)。
特殊的索引存放方式,可以减少IO,提升查询效率。
Memory特点:
把数据放在内存里面,读写的速度很快,但是数据库重启或者崩溃,数据会全部消失。只适合做临时表。
03、InnoDB内存结构
【1】、Buffer Pool
缓存的是数据页、索引页等。
内存的缓冲池写满了怎么办?InnoDB用LRU算法来管理缓冲池。LRU:最近最少使用.
当需要更新一个数据页时,数据页在BufferPool中不存在,怎么操作?
【2】、Change Buffer 写缓存
数据页不是唯一索引,不存在数据重复的情况下,可以先把修改记录在内存的缓冲池中,从而提升更新语句的执行速度。
Change Buffer里面的数据记录,记录到数据页的操作叫做merge。
什么时候发生merge?
通过后台线程、数据库shut down或redo log写满时触发。
ChangeBuffer占BufferPool的比例,默认25%。
【3】、Adaptive Hash Index
【4】、redo Buffer(重点)
出现数据库宕机或者重启时候,BufferPool里面的记录没有刷入磁盘,导致数据丢失。这种情况怎么解决?
InnoDB把所有对页面的修改操作专门写入redo log文件,并且在数据库启动时从这个文件进行恢复操作。
redo log 存储在/var/lib/mysql/目录下的ib_logfile0和ib_logfile1,每个48M。
关键点就是先写日志,再写磁盘(WAL技术)。
注意:redo log的内容主要是用于崩溃恢复。磁盘的数据文件,数据来自buffer pool。redo log写入磁盘,不是写入数据文件。
特点:
1、redo log是InnoDB存储引擎实现的
2、不是记录数据页更新之后的状态,而是记录这个页做了什么改动,属于物理日志。
3、redo log的大小是固定的,前面的内容会被覆盖。
【5】、log Buffer【重要】
当然redo log 不是每一次都直接写入磁盘,在Buffer Pool里面有一块内存区域(Log Buffer)专门用来保存即将要写入日志文件的数据,默认16M。
我们写入数据到磁盘的时候,操作系统本身是有缓存的。flush就是把操作系统缓冲区写入到磁盘。
log buffer写入磁盘的时机,由一个参数控制,默认是1。
每次事务提交时MySQL都会把log buffer的数据写入log file,并且刷到磁盘中去。
【6】、undo log tablespace 重点
undo log(撤销日志或回滚日志)记录了事务发生之前的数据状态(不包括select)。
undoLog的数据默认在系统表空间ibdata1文件中。
【7】、总结:更新操作的流程。
update user set name='xxxx' where id=1;
1、事务开始,从内存或磁盘取到这条数据,返回给Server的执行器;
2、执行器修改这一行数据的值为xxxx;
3、记录name=‘原来的值’到undo log;
4、记录name=xxxx到redo log;
5、调用存储引擎接口,在内存(Buffer Pool)中修改name=xxxx;
6、提交事物
【8】、Binlog
binlog以事件的形式记录了所有的DDL和DML语句,记录的是操作而不是数据值,属于逻辑日志。
作用?数据的恢复和主从复制。
03、表空间
双写缓冲区
如果这个页本身已经损坏了,用它来做崩溃恢复是没有意义的。所以在对于应用redolog之前,需要一个页的副本。如果出现了写入失效,就用页的副本来还原这个页,然后再应用redo log。这个页的副本就是double write,InnoDB的双写技术。通过它实现了数据页的可靠性。
【1】、系统表空间 system tablespace
在默认情况下InnoDB存储引擎有一个共享表空间(对应文件/var/lib/mysql/ibdata1),也叫系统表空间
【2】、独占表空间 file-per-table tablespaces
可以让每张表独占一个表空间。
【3】、通用表空间general tablespaces
创建一个通用的表空间,用来存储不同数据库的表
【4】、临时表空间temporary tablespaces
存储临时表的数据,包括用户创建的临时表,和磁盘的内部临时表。