我们平时使用数据库,操作的都是针对数据库整体的使用。
那么数据库是由那些组件组成的呢?数据库的基本框架又有哪些呢??我们平时一个查询的操作,会引发数据库怎样的处理?

select * from fisha_tb1 where fisha_atuhor = 'fish';

mysql的基本结构

下图为mysql的基本结构图


  • 可以看到mysql的基本结构分为两大部分,Server层存储引擎层

Server层

对应Server层包括:连接器查询缓存分析器优化器执行器
这里面涵盖了mysql的大部分服务功能:内置函数,存储过程,视图,触发器等等。

连接器

这是使用数据库的第一步,连接器需要跟客户端建立连接,获取权限,维持和管理连接。

mysql -h IP -P 端口 -u 用户 -p

当输入用户对应密码正确后,连接器就会到权限表里查询该用户对应的权限。连接完成后如果没有后续的操作,这个连接就处理空闲状态,可使用命令show processlist查看

  • 客户端如果太长时间没有操作,连接器就会自动断开连接,这个超时时间是由wait_timeout控制的,默认为8个小时。
  • mysql的长连接是指:客户端在连接成功后,如果客户端一直有请求,则继续使用同一连接。端连接是指每次都查询几条数据后就断开连接,下一次查询请求接收后,再继续建立连接后操作。
  • 连接的建立和断开都是需要耗费资源的,所以建议使用长连接。
  • 但是如果一直使用长连接,你会发现mysql占用内存会越来越大,这是因为mysql在执行过程中使用到的内存是管理连接的内存。而连接只有在断开后才,内存才可以释放。
  • 所以客户端如果一直使用长连接进行操作,mysql占用的内存越来越大后,会被系统kill掉,这就造成了mysql的异常重启。

那么该如何占内存解决这个问题呢?
第一种方法:我们可以定期的断开连接
第二种方法:如果是5.7后的版本,我们在执行完一个比较大的操作后,可以使用mysql_reset_connection来重新初始化连接资源。

查询缓存

连接建立之后,就可是登录mysql使用select查询操作了。连接后执行逻辑就来到查询缓存这里。

  • 根据查询条件生成的hash码寻找是否存在对应的缓存数据,如果之前有执行过改语句,其查询结果就会被存储在内存中。如果hash命中了就会返回缓存数据,而不用执行语句查询结果。
  • 但是平时我们对一般表数据的更新都是非常频繁的,增删改等等,在这种情况下,数据缓存的失效率就会很大,那么使用查询缓存的意义也就不大。
  • 可以使用query_cache_type设置demand 按需缓存,设置需要使用查询缓存的语句。
  • mysql8.0版本的查询缓存部分被删掉了。

分析器

如果没有查询缓存或者没有命中缓存的情况下,就需要进行语句的执行来查询数据了。
根据词法分析和语法分析对sql语句进行解析,对比语句字符串代表意义和语句语法是否存在错误等等;

优化器

经过分析器后,myql就知道你需要做什么了,分析完成后的执行逻辑就来到了优化器这里,在执行之前需要经过优化处理。
优化器是在表里有多个索引的时候,决定使用哪个索引,或在多表查询的时候决定各个表的连接顺序

select * from fisha_tb1 a join fisha_dep b using(dep_id) where a.fisha_id=2 and b.dep_name='it';


这条执行语句有两种顺序:
第一种,先取出a表中fisha_id等2的数据,再根据dep_id关联到b表中dep_name等于it的数据。
第二种,先取出b表中dep_name等it的数据,再根据dep_id关联到a表中fisha_id等2的数据。
这两种顺序的结果返回数据都是一样的,但是执行的效率会不同,这就需要优化器决定使用哪种执行顺序。

执行器

经过优化器后,执行的逻辑就来到了执行器,开始执行语句。
在执行时,你需要检查对操作的表有咩有执行查询的权限,如果有就可以打开表执行。
打开表时,执行器根据表的引擎定义,使用引擎提供的接口,比如文章开头那个查询语句的大致执行流程如下:

    1. 调用InnoDB引擎的接口取fisha_tb1表的第一行,判断fisha_atuhor值是否为fish,如果不是就跳过,如果是就把这行数据存在结果集中。
    1. 调用引擎接口取下一行,重复上一步的操作,直到最后一行。
    1. 将结果集返回给客户端。

到此,一条查询语句经过连接器,查询缓存,分析器,优化器,执行器才可以到最后返回符合条件的结果集。

存储引擎层

存储引擎层主要负责数据的存储和提取,其架构模式是插拔式的,有InnoDB,Myisam,Memory等等,从mysq5.5.5版本开始。默认设置的存储引擎为InnoDB。