MySql技术内幕笔记(一)MySql体系结构和存储引擎

数据库和数据库实例

       数据库:物理操作系统文件或其他形式文件的集合。

       数据库实例:由后台线程以及一个共享内存区组成。数据库实例才是真正用于操作数据库文件的。一个实例对应一个数据库。

MySql体系结构

    

          Mysql数据库区别于其它数据库的最重要的特点就是其插件式的表存储引擎。注意:存储引擎是基于表的而不是基于数据库的。

MySql存储引擎

    (一)InnoDB:

         1.支持事务,支持ACID四种隔离级别

         2.支持行级锁以及外建约束,因此支持写并发

         3.不存储总行数,不支持全文索引

         4.使用next-keylocking策略来避免幻读,提供插入缓冲、二次写、自适应hash索引、预读等高性能和高可用的功能

         5.主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引;最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。

(二)MyISAM

       1.不支持事务

       2.支持表级锁,每次操作都是对整个表加锁

       3.存储表的总行数,支持全文索引

      4.缓冲池只缓存索引文件,而不缓冲数据文件

      5.非聚集索引,索引文件的数据域指向数据文件的指针

(三)NDB存储引擎

       1.NDB存储引擎是一个集群存储引擎。

       2.NDB的特点是数据全部放在内存中,因此主键查找极快。

       3.NDB存储引擎的Join操作是在Myql数据层完成的而不是存储引擎层,因此查询速度很慢。

(四)Memory存储引擎

      1.Memory存储引擎默认使用hash索引,表中的数据存放在内存中,如果数据库重启或崩溃,表中的数据都将消失。

      2.只支持表锁,并发性能差,存储变长字段是按照定常字段进行的,因此会浪费内存。

  连接MySQL

连接MySQL是一个连接进程和MySQL数据库实例进行通信。从程序设计的角度来说,本质上是进程通信。

连接MySQL的方式有:TCP/IP套接字、命名管道和共享内存、UNIX域套接字。

InnoDB存储引擎:

 1.体系结构:

      Innodb存储引擎主要包括内存池以及后台线程

     内存池:多个内存块组成内存池,主要维护线程的内部数据、缓存磁盘数据、修改文件前先修改内存。

     后台线程:主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。此外将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下能恢复到正常运行状态。

2.后台线程:

    1.MasterThread

      负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新,合并和插入缓冲。

   2.IO Thread

     在InnoDB存储引擎中大量使用了AIO来处理IO请求,这样可以极大提高数据库的性能,IO Thread的工作则是负责这些IO请求的回调。

 3.Purge Thread

    事物被提交后,其所使用的undolog可能不再需要,因此需要PurgeThread来回收已经使用并分配的undo页

3.内存:

    概念:

    Undo日志记录某数据被修改前的值,可以用来在事务失败时进行rollback;

    Redo日志记录某数据块被修改后的值,可以用来恢复未写入data file的已成功事务更新的数据。(即重做日志)

      1.缓冲池:

           缓冲池就是一块内存区域,通过内存的速度来弥补磁盘的速度较慢对数据库性能的影响。在数据库中进行读取页的操作,首先将从磁盘中的页存放到缓冲池当中,这个过程称为fix在缓冲池。下一次再读取相同的页时,首先判端该页是否在缓冲池中。若在,则称 该页被命中,直接读取,否则读取磁盘中的页。

          修改操作则是首先修改缓冲池中的页,然后再通过checkPoint机制刷回磁盘。可以通过innodb_buffer_pool来设置缓冲池的配置。

      缓冲池中存储的数据页类型:索引页、数据页、undo页、插入缓冲、自适应hash索引、InnoDB存储的锁信息、数据字典信息

      2.LRU List FreeList FlushList

    一般数据库中的缓冲池是通过LRU算法来管理 的。即最频繁使用的页在LRU页列表的前端,而最少使用的页在LRU列表的尾端。当缓冲池不能存放新读取的页时,将首先释放LRU列表中最末端的页/

  在Innodb存储引擎中,新读取的列放入LRU列表的midPoint中,默认 5/8处,由参数innodb_old_blocks_oct控制

FreeList

  数据库刚启动的时候,LRU 列表为空,此时需要用到的时候直接将Free列表中的页删除,在LRU列表中增加相应的页,维持页数守恒。

Flush List  

  当LRU列表中的页被修改后,称该页为脏页(dirty page),即缓冲池中的页和磁盘上的页数据产生了不一致。这时候数据库会通过checkpoint机制将脏页刷新回磁盘,而Flush 列表中的页即为脏页列表。注意脏页也存在于LRU列表中。 

  3.重做日志缓冲

     InnoDB存储引擎首先将重做日志信息放入缓冲区,然后按照一定频率刷新到缓冲区。

     (1)Master Thread每一秒将重做日志缓冲刷新到重做日志文件

     (2)每个事物提交时会将重做日志刷新到重做日志文件

     (3)当缓冲池空间小于1/2时,会将日志缓冲刷新到重做日志文件

  • 为了防止脏页在刷新到磁盘时宕机,必须先redolog,再修改页;
  • 数据库发生宕机时,通过redolog完成数据的恢复(ACID-D持久性)
  • 默认大小8M,通过innodb_log_buffer_size

  4.checkPoint技术:

     作用:

      1.缩短数据库的恢复时间

      由于checkpoint之前的数据都刷回去磁盘了,所以只需要对checkpoint后的重做日志进行恢复。大大缩短了恢复时间。

      2.缓存池不够用时,将脏页刷新到磁盘

      LRU算法会溢出最近最少使用的页,如果是脏页,强制Checkpoint。

      3.重做日志不可用的时候,刷新脏页。

     重做日志的空间是循环使用的,当要被重用的时候,被重用的部分必须进行checkpoint。

   分类:

       1.Sharpy CheckPoint

       是在数据库关闭时刷新全部数据

     2.Fuzzy CheckPoint

       运行时使用,指刷新一部分脏页。

5.innodb引擎的4大特性

1.插入缓冲(insert buffer)
2.二次写(double write)
3.自适应哈希索引(ahi)
4.预读(read ahead)

参考:

《mysql技术内幕-InnoDB存储引擎》

猜你喜欢

转载自blog.csdn.net/weixin_42173193/article/details/88684432