MySQL深入学习(1)——体系结构与存储引擎简介

1. 体系结构

     1. 首先简单的了解一下什么是数据库系统:数据库管理系统由一个互相关联的数据的集合和一组用以访问这些数据的程序组成。这个数据集合通常称为数据库。

    在数据库系统出现之前,是使用的文件系统,其存在非常大的弊端:

(1)数据的冗余和不一致:文件通常由不同人创建、维护,相同信息可能存在多个文件,冗余的信息占用了存储空间,并且当部分数据进行修改时可能因某些文件未同时修改而导致数据不一致。
(2)数据访问困难:文件一般以一定规律排布信息,数据的访问只能依赖于该规律,当出现新需求时,又需要重新编排。                      (3)数据孤立:数据分散在不同文件中,并且文件格式可能不同。
(4)完整性问题:
(5)原子性问题:典型的银行转账问题。
(6)并发访问异常:文件处理系统无法应对高并发访问。
(7)安全性问题:并非文件系统的所有用户都可以访问所有数据。

    而数据库系统则是通过一个管理系统程序来维护管理这些数据文件,所有的客户端或者说用户,都必须通过该管理系统进行读写操作数据文件,该管理系统程序需主要负责

  • 存储管理:逻辑关系与物理存储的映射
  •  缓存机制:优化执行效率
  •  SQL解析:提供外部可操作的语言解析
  •  日志管理:记录操作、运行信息,并提供恢复依据
  •   权限划分:多用户管理
  •   容灾机制:灾难应对及恢复机制
  •   索引管理:优化查找效率
  •   锁管理:应对并发

    对于MySQL数据库来说,其详细架构图如下

   由上图可以看到, MySQL数据库主要有以下几部分组成:

(1)连接池组件:对,该组件和在Java中所使用的的数据库连接池概念相同,由于每次建立建立需要消耗很多时间,连接池的作用就是将这些连接缓存下来,下次可以直接用已经建立好的连接,提升服务器性能。

(2)管理服务和工具组件:系统管理和控制工具,例如备份恢复、Mysql复制、集群等。

(3)SQL接口组件:接受处理从连接中接收到的用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface

(4)查询分析器组件:在调用SQL接口组件执行SQL命令前,首先要进行解析命令,判断该SQL命令是否合法,SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本, 主要功能:
a . 将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的
b. 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的,此时就会通过数据库连接来告知客户端该SQL语句的错误信息,同事还会返回一个对应的错误码。

(5)优化器组件:SQL语句解析完毕后,只要没有错误,那么就会进行SQL语句优化,在进行查询之前,会对查询语句进行一定的优化,使用的是“选取-投影-联接”策略进行查询。
用一个例子就可以理解: select uid,name from user where gender = 1;
这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤
这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤
将这两个查询条件联接起来生成最终查询结果

(6)缓冲组件:在通过Navicat等数据库客户端软件进行数据库查询时,我们会发现,如果多次执行同一条查询语句,除了第一次耗时比较长之外,后续的查询耗时都会较短,这就是缓冲组件所起的作用。缓冲组件主要的作用就是查询缓存,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。但是,缓存空间的大小肯定是有限制的,所以一般都是通过LRU算法将数据的冷端溢出,未来得及时刷新到磁盘的数据页,叫脏页。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等,如果当然,一旦有数据写操作时,缓冲中的数据自然会失效。只有多次对于同一条SQL语句的查询才能看到缓存现象。

(7)插件式存储引擎(MySQL中的存储引擎是基于表的,而不是数据库的):对于不同的存储引擎,其数据文件格式、存储方式、SQL执行接口实现都不相同,在实际应用中,我们需要依据表中存储的数据特性,为该表选取合适的数据库存储引擎。

(8)物理文件系统:存储的应用数据、操作日志数据等都会在文件系统中进行存储。

2. 存储引擎

    MySQL中的存储引擎有很多种,使用最多的就是innoDB存储引擎了,每个引擎都有一些不同之处,其支持的特性如下:

(1)innoDB存储引擎:MySQL的默认存储引擎,面向OLTP(online transaction processing,即在线事务处理)、行锁以及表锁、支持外键、非锁定读(默认读操作不会加锁);

通过MVCC实现(多版本并发控制)来实现高并发,并实现了四种事务隔离级别,分别是读未提交、读已提交、可重复读以及序列化,默认采用可重复读,通过next-keylocking策略避免幻读、插入缓冲、二次写、自适应哈希索引、预读。

对于表中数据的存储,innoDB采用了聚集方式,也就是表中每条数据的存放都是按照主键的顺序存储,如果没有显式的指定表中的主键,那么innoDB会自动为每一行数据生成一个6字节的rowid字段作为主键。.idb文件就是innoDB存储引擎生成的表数据文件。

(2)MyISAM存储引擎: 不支持事务、表锁、全文索引、适合olap(在线分析处理),其中.myd文件放具体数据,.myi文件放索引数据。对于MyISAM引擎表,MySQL数据库只会缓存其索引文件,也就是myi

(3)ndb存储引擎: 集群存储引擎,share nothing,可提高可用性,该引擎会将所有数据全部存储在内存中。

(4)Memory存储引擎: 数据存放在内存中,表锁,并发性能差,默认使用哈希索引

(5)Archive存储引擎:只支持insert和select zlib算法压缩1:10,适合存储归档数据如日志等、行锁

(6)Maria存储引擎: 目的取代myisam、缓存数据和索引、行锁、mvcc

可以通过show engines;指令来查看MySQL数据支持的存储引擎。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章