1.Mysql 单进程多线程
2.数据库和实例的定义
- 数据库:物理操作系统文件或其他形式文件类型的集合。
- 实例:Mysql数据库实例在系统上的表现就是一个进程。是位于用户和操作系统之间的一层数据管理软件。
3.Mysql组成部门
- 连接池组件
- 管理服务和工具组件
- SQL接口组件
- 查询分析器组件
- 优化器组件
- 缓冲(Cache)组件
- 插件式存储引擎
- 物理文件
4.InnoDB后台线程
- Master Thread
- 负责将缓冲池中的数据异步刷新到磁盘,保证数据一致性,包括脏页的刷新,合并插入缓冲(INSERT BUFFER),UNDO页的回收。
- IO THREAD
- 负责IO请求的回调处理
- Purge【清理】 Thread
- 回收已经使用并分配的undo页。
- Page Cleaner Thread
- 将之前版本中脏页的刷新操作都放入单独的线程中来完成。其目的是为了减轻原Master Thread的工作及对于用户查询线程的阻塞,进一步提高InnnoDB存储引擎的性能。
5.重做日志缓冲
- InnoDB存储引擎首先将重做日志信息先放入redo log 缓冲区,然后按一定频率将其刷新到重做日志文件。重做日志缓冲一般不需要设置得很大,因为一般情况下每一秒会将重做日志缓冲刷新到日志文件,因此用户只需要保证每秒产生的事务量在这个缓冲大小之内即可。
- 重做日志缓冲刷新到磁盘中重做日志文件的情况
- Master Thread 每一秒将重做日志缓冲刷新到重做日志文件
- 每个事务提交时会将重做日志缓冲刷新到重做日志文件里。
- 当重做日志缓冲池剩余空间小于1/2时,重做日志缓冲刷新到重做日志文件。
6.redo log与bin log
- bin log 日志会记录所有与mysql数据库有关的日志记录,包括InnoDB,MyISAM等其它存储引擎的日志。而InnoDB存储引擎的重做日志只记录有关该存储引擎本身的事务日志。
- bin log记录的是一个事务的具体操作内容,即该日志的逻辑日志。而InnoDB记录关于每个页的更改的物理情况。
- bin log仅在事务提交前进行提交。只写磁盘一次。而在事务进行过程中,却不断有重做日志条目被写入到重做日志文件中。
6.Checkpoint(检查点)
当数据库发生宕机时,数据库不需要重做所有日志,因为Checkpoint之前的页都已经刷新回磁盘。故数据库只需要对Checkpoint后的重做日志进行恢复,大大缩减恢复的时间。
- 缩短数据库恢复时间
- 缓冲池不够用时,将脏页刷新到磁盘
- 重做日志不可用时,刷新到脏页
7.InnoDB逻辑存储结构
所有数据都被逻辑地放在一个空间,称之为表空间
- 表空间组成
- 段(segment)
- 区(extent)
- 页(page)
表空间
- ibdata1 默认表空间
8.Innodb不支持hash索引
9.show index from 显示索引信息
主要字段
- Collation(校对): 列以什么方式存储在索引中。可以是A或Null。B+树索引总是A,即排序。如果使用了Heap存储引擎,并建立了Hash索引,这里就会显示NULL。因为Hash根据Hash桶存放索引数据,而不是对数据进行排序。
- Cardinality(基数): 非常关键的值,表示索引中唯一的数目估计值。
- NULL: 是否索引的列含有NULL。
10. 优化器不使用索引的情况
- 当sql执行范围查找,join链接操作等情况,会发现优化器并没有选择索引去查找数据,而是通过扫描聚集索引。
- e.g select * from order where orderid>10000 and orderid<12000
- 选取的数据是整行信息,而orderid索引不能覆盖到查询的信息,因此对orderid索引查询到指定数据后,还需要一次回表查询。回表查询在磁盘上是离散读操作。如果要求访问的数据量很小,则优化器还是会选择辅助索引,但是当访问的数据占整个表中数据量大时(20%左右),优化器会选择通过聚集索引来查找数据。因为顺序读远远快于离散读。