【mysql数据库】[mysql简介]+[存储结构]+[索引知识]
一、整体介绍
二、服务端架构整体介绍
mysql支持的常见存储引擎:InnoDB、MyISAM、MEMORY
【存储引擎的概念】是指表的类型以及表在计算机上的存储方式
命令
//查看数据库存储引擎 SHOW ENGINES
//查看数据库的binlog文件列表
show master logs
2.1、InnoDB存储引擎:
(1)InnoDB支持【事务ACID】 : 原子性,一致性,持久性,隔离性
(2)InnoDB支持【行级锁】。行级锁可以在最大程度上支持并发。
(3)InnoDB是为处理巨大数据量的最大性能设计,InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存(数据)和(索引)而维持它自己的【缓冲池】。
(4) InnoDB支持【崩溃数据自修复】。InnoDB存储引擎中就是依靠redo log来保证的。当数据库异常崩溃后,数据库重新启动时会根据redo log 和 undo log进行数据恢复,保证数据库恢复到崩溃前的状态。
(5)支持【多版本并发MVCC】、支持外键
2.2、MyISAM存储引擎:
(1)MyISAM存储引擎【不支持事务】
(2)其锁定机制是【表级索引】,虽然可以让锁定的实现成本很小,但是也同时大大降低了其并发性能。 写入时阻塞读,读时阻塞写,读读不阻塞。
(3)只会【缓存索引】:MyISAM可以通过key_buffer缓存,以大大提高访问性能减少磁盘I/O,但是这个缓冲区只会缓存索引,而不会缓存数据。
(4)适用于不需要事务支持(不支持)、并发相对较低(锁定机制问题)、数据修改相对较少(阻塞问题)、【以读为主这类场景】。
2.3、MEMORY存储引擎:
一类特殊存储引擎,使用存储在内存中的内容来创建表,而且所有数据也放在【内存中】。
①每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm类型。该文件中只存储表的结构,数据文件则存储在内存中。
② MEMORY默认使用【哈希索引】,速度比使用B型树索引快。如果想用B型树索引,可以在创建索引时指定。
③ MEMORY存储引擎是把数据存到内存中,如果内存出现异常就会影响数据。如果重启或者关机,那么所有数据都会消失。
三、服务端架构分层介绍
3.1、逻辑架构
3.2、核心服务层介绍
(1)Connectors:指的是不同语言中与SQL的交互。
(2)Management Services & Utilities:管理服务和工具组件,从备份和恢复的安全性、复制、集群、管理、配置、迁移和元数据等方面管理数据库。
(3)Connection Pool:连接池,是为解决资源的频繁分配﹑释放所造成的问题而为数据库连接建立的一个“缓冲池”。原理是预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。它的作用是进行身份验证、线程重用、连接限制、管理用户的连接、线程处理等需要缓存的需求。
(4)SQL Interface(SQL接口):接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface。
(5)Parser:解析器,验证和解析SQL命令。SQL命令传递到解析器的时候会被解析器验证和解析,并生成一棵对应的解析树。在这个过程中,解析器主要通过语法规则来验证和解析。比如SQL中是否使用了错误的关键字或者关键字的顺序是否正确等。
(6)Optimizer:查询优化器。SQL语句在查询执行之前,会使用查询优化器对查询进行优化,得出一个最优的策略。多数情况下,一条查询可以有很多种执行方式,最后都返回相应的结果。优化器的作用就是找到其中最好的执行计划。
(7)Cache和Buffer:主要功能是将客户端提交给MySQL的select类query请求的返回结果集缓存到内存中,与该query的一个hash值做一个对应。该query所取数据的基表发生任何数据的变化之后,MySQL会自动使该query的Cache失效。如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的,比如表缓存、记录缓存、key缓存、权限缓存等。
(8)Pluggable Storage Engines:可插拔存储引擎。MySQL区别于其他数据库的最重要的特点就是其插件式的存储引擎接口模块。这个模块实际上只是一个抽象类。根据MySQL AB公司提供的文件访问层的一个抽象接口来定制一种文件访问机制,这种访问机制就称为存储引擎。正是因为它成功地将各种数据处理高度抽象化才成就了今天MySQL可插拔存储引擎的特色。每个存储引擎开发者都可以按照自己的意愿来进行开发,存储引擎是基于表的。
(9)File System:数据存储在运行于裸设备的文件系统之上,支持的文件类型有EXT3、EXT4、NTFS、NFS。
(10)File&Logs:数据文件以及redo、undo等各种日志文件。
3.3、重要的日志文件
(1)binlog二进制日志文件:不管使用的是哪一种存储引擎,都会产生binlog。binlog记录了MySQL对数据库执行更改的所有操作。MySQL的binlog_format参数。这个参数有可选值【statement】和【row】:statement就是之前的格式,基于SQL语句来记录;row记录的则是行的更改情况,可以避免之前提到的数据不一致的问题。【做MySQL主从复制】,statement格式的binlog可能会导致主备不一致,所以要使用row格式。我们还需要借助mysqlbinlog工具来解析和查看binlog中的内容。如果需要用binlog来恢复数据,标准做法是用mysqlbinlog工具把binlog中的内容解析出来,然后把解析结果整个发给MySQL执行。
(2)redo重做日志文件:ib_logfile0、ib_logfile1是InnoDB引擎特有的、用于记录InnoDB引擎下事务的日志,它记录每页更改的物理情况。首先要搞明白的是已经有binlog了为什么还需要redo log,因为两者分工不同。binlog主要用来做数据归档,但是并不具备崩溃恢复的能力,也就是说如果系统突然崩溃,重启后可能会有部分数据丢失。Innodb将所有对页面的修改操作写入一个专门的文件,并在数据库启动时从此文件进行恢复操作,这个文件就是redo log file。redo log的存在可以完美解决这个问题。默认情况下,每个InnoDB引擎至少有一个【重做日志组】,每组下至少有两个重做日志文件,例如前面提到的ib_logfile0和ib_logfile1。重做日志组中的每个日志文件大小一致且循环写入,也就是说先写iblogfile0,写满了之后写iblogfile1,一旦iblogfile1写满了,就继续写iblogfile0。当innodb log设置过大的时候,可能会导致系统崩溃后恢复需要很长的时间;当innodb log设置过小的时候,在一个事务产生大量日志的情况下,需要多次切换重做日志文件。
(3)共享表空间和独立表空间
【共享表空间(系统表空间)】:存储公共东西用户自定义数据库中的某些元数据信息、回滚(undo)信息、插入缓冲(change buffer)、二次写缓冲(double write buffer)等还是存放在共享表空间,所以又称为系统表空间。
【独立表空间】:独立表空间innodb_file_per_table参数默认开启,每个数据库的每个表都有自已独立的表空间,每个表的【数据和索引】都会存在自己的表空间中。
(4)undo log:undo log是回滚日志,如果事务回滚,则需要依赖undo日志进行回滚操作。MySQL在进行事务操作的同时,会记录事务性操作修改数据之前的信息,就是undo日志,确保可以回滚到事务发生之前的状态。,innodb_undo_directory参数指定单独存放undo表空间的目录,该参数实例初始化之后不可直接改动(可以通过先停库,修改配置文件,然后移动undo表空间文件的方式去修改该参数)
(5)临时表空间:存储临时对象的空间,比如临时表对象等
(6)errorlog:错误日志记录了MySQL Server每次启动和关闭的详细信息,以及运行过程中所有较为严重的警告和错误信息。
(7)slow.log:如果配置了MySQL的慢查询日志,MySQL就会将运行过程中的慢查询日志记录到slow_log文件中。MySQL的慢查询日志是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL。参数slow_query_log_file指定慢查询日志文件的存放路径;参数long_query_time的默认值为10,意思是运行10s以上的语句。
(8)general_log:如图1-13所示,参数general_log=off表明没有启用通用查询日志,如果配置了通用查询日志,将记录建立的client连接和运行的语句。参数general_log_file表明通用查询日志位置及名字,MySQL将运行过程中的所有SQL都记录在此文件中。
3.4、InoDB存储引擎体系结构
【InnoDB存储引擎有各种缓冲池(Buffer Pool)】,这些缓冲块组成了一个大的InnoDB存储引擎内存池,主要负责的工作是:维护所有进程/线程需要访问的多个内部数据结构;缓存磁盘上的数据,方便快速读取,同时在对磁盘文件修改之前进行缓存;重做日志缓存等。
【后台线程】的主要作用是:负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最新数据;将已修改数据文件刷新到磁盘文件;保证数据库发生异常时InnoDB能恢复到正常运行的状态。
- bufferPool的相关知识见:https://www.cnblogs.com/shangxiaofei/articles/14422939.html
- 后台线程的相关知识见下边描述:
3.5、mysql的InoDB后台线程
四、行格式和页结构
1、compact行格式
2、记录头信息
3、redundant行格式
4、1个数据页的结构
5、数据在磁盘上的存储格式
6、用户记录的存储格式
7、页与页的存储格式
五、索引结构