MySQL体系结构和存储引擎定义数据库和实例
在Linux操作系统中通过以下命令启动MySQL数据库实例,并通过命令ps观察MySQL数据库启动后进程:
MySQL数据库会去读取配置文件,如果几个配置文件都有同一参数,MySQL数据库以独到最后一个配置文件中的参数为准。
配置文件中有一个参数datadir,该参数指定了数据库所在的路径。在Linux操作系统下默认datadir为/usr/local/mysql/data,用户可以修改该参数,也可以使用该路径,不过改路径只是一个链接。
从上面可以看出,data只是一个软连接,该链接指向了/opt/mysql_data目录,当然,用户必须保证/opt/mysql_data的用户和权限,使得只有mysql用户和组可以访问(MySQL数据库的权限为mysql:mysql)MySQL体系结构
MySQL由以下几部分组成,连接池组件、管理服务和工具组件、SQL接口组件、查询分析器组件、优化器组件、缓冲组件、插入式存储引擎、无力文件
MySQL区别于其它存储引擎,存储引擎是基于表的,而不是数据库。存储引擎
存储引擎的特性:
查看存储引擎:
创建数据引擎的TABLE:CREATE TABLE mytest ENGINE=MYISAM
存储引擎的选择会影响到表的大小连接MySQL
连接Mysql操作是一个连接进程和MySQL数据库实例进行通信。
TCP/IP
mysql -h192.168.0.101 -u david -p
use mysql;
select host,user from User;
InnoDB存储引擎InnoDB体系架构
后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。此外将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下InnoDB能恢复到正常运行状态。
后台线程
1.Master Thread
Master Thread负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲、undo页的回收等。
2.IO Thread
通过SHOW ENGINE INNODB STATUSG;
命令来观察InnoDB中的IO Thread:
3.Purge ThreadSHOW VARIABLES LIKE 'innodb_purge_threads'G;
4.Page Cleaner Thread
作用是将之前版本中脏页的刷新操作都放入到单独的线程中来完成。其目的是为了减轻原Master Thread的工作及对于用户查询线程的阻塞,进一步提高InnoDB存储引擎的性能。
内存缓冲池
通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。
缓冲池个数:
show engine innodb statusG;
LRU List、Free List 和 Flush List
数据库中的缓冲池是通过LRU(Latest Recent Used,最近最少使用)算法来进行管理的。即最频繁使用的页在LRU列表的前端,而最少使用的页在LRU列表的尾端。当缓冲池不能存放读取到的页时,将首先释放LRU列表中的尾端的页。
在InnoDB存储引擎中,缓冲池中页的默认大小为16KB, 同样使用LRU算法对缓冲池进行管理。稍有不同的是InnoDB存储引擎对传统的LRU算法做了一些优化。在InnoDB的存储引擎中,LRU列表中还加入了midpoint位置。
新读取到的页,并不是直接放入LRU列表首部,二是midpoint位置。
set global innodb_old_blocks_time=1000;
通过表INNODB_BUFFER_POOL_STATS来观察缓冲池的运行状态。
此外,还可以通过表INNODB_BUFFER_PAGE_LRU来观察每个LRU列表中每个页的具体信息,例如通过下面的语句可以看到缓冲池LRU列表中SPACE为1的表的页类型。
InnoDB存储引擎将原本16KB的页压缩为1KB、2KB、4KB和8KB。而由于页的大小发生了变化,LRU列表也发生了些许改变。对于非16KB的页,是通过unzip_LRU列表进行管理的。
重做日志缓存
额外的内存池
Chectpoint技术
局限性:
日志不可能无限地增大(成本要求太高),同时缓冲池也无限的增大,能够缓冲足够的数据。就算满足以上两个条件,宕机后数据库恢复时间,数据库运行几个月甚至几年,重做日志会花费非常久的时间。
此时CheckPoint(检查点)技术的目的是解决一下几个问题:缩短数据库恢复的时间
缓冲池不够用时,将脏页刷新到磁盘
重做日志不可用时,刷新脏页
几个关键的名词:
缓冲池的作用是等待和存储用户输入的操作命令
缓冲池基于的LRU算法,即将旧页放在列表后面,将新页放在列表前面。
但是由于一些sql操作比如索引,会将热点数据刷出,设计了midpoint点,midpoint表前面部分成为new表,后面部分称为old表
在缓冲池的LRU被修改后,这时磁盘和缓冲池的数据不一致,产生脏读,数据库就会通过CheckPoint机制将脏页刷新到磁盘。由于页的操作都是现在缓冲池中进行的,会有以下几个问题:1.缓冲池不是无限大2.在数据从页的新版本刷新到磁盘的过程中可能会遇到宕机,为了避免数据丢失,就采取日志记录,但是日志也不是无限大。(Write ahead Log策略)
Checkpoint技术就解决了数据从缓冲池到磁盘更新问题。
Sharp CheckPoint发生在数据库关闭时将所有的脏页都刷新回到磁盘,这时默认的工作方式innodb_fast_shutdown=1。
但是若数据库在运行时也使用Sharp CheckPoint, 那么数据库的可用性就会收到很大影响。故在InnoDB存储引擎内部使用Fuzzy CheckPoint进行页刷新,即只刷新一部分脏页,而不是刷新所有的脏页回磁盘。
在Innodb存储引擎中可能发生如下几种情况的Fuzzy Checkpoint:
Master Thread CheckPoint和FLUSH_LRU_LIST CheckPoint:
Async/Sync Flush CheckPoint:
Dirty Page too much CheckPoint:
Master Thread工作方式
InnoDB存储引擎主要工作都是在一个单独的后台线程Master Thread中完成,
Master Thread具有最高的线程优先级别,其内部由多个循环(loop)组成,主循环(main loop) 后台循环(backgroup loop)、刷新循环(flush loop)、暂停循环(suspend loop)。
Master Thread会根据数据库运行的状态在loop, backgroup loop, flush loop, 和suspend loop中进行切换。
InnoDB关键特性插入缓冲(Insert Buffer)
Insert Buffer是物理页的一个组成部分。
两次写(Double Write)
自适应哈希索引(Adaptive Hash Index)
哈希(hash)是一种非常快的查找方法,查找时间复杂度为O(1), 即一般仅需要一次查找就能定位数据。而B+树的查找次数,取决于B+树的高度。异步IO(Async IO)
为了提高磁盘操作性能,当前的数据库系统都采用异步IO的方式来处理磁盘操作。InnoDB存储引擎亦是如此。刷新领接页(Flush Neighbor Page)
当一个脏页时,InnoDB存储引擎会检测该页所在区(extent)的所有页,如果是脏页,那么一起刷新。
启动、关闭与恢复关闭
恢复
在设置了参数innodb_force_recovery 大于0后,用户可以对表进行select、create和drop操作,但insert、update和delete这类DML操作不允许。