1.第一层:对客户端的连接处理、安全认证、授权等,每个客户端连接都会在服务端拥有一个线程,每个连接发起的查询都会在对应的单独线程中执行。
mysql如果一直保持连接状态,mysql会把内存吃满,此时可以使用两种方案: (1)断开一段时间后重连 (2)通过执行 mysql_reset_connection来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。
2.第二层:MySQL的核心服务功能层,包括查询解析、分析、查询缓存、内置函数、存储过程、触发器、视图等,select操作会先检查是否命中查询缓存,命中则直接返回缓存数据,否则解析查询并创建对应的解析树。如下图,解析器会将命令分类为select、dml、ddl、rep、status五个模块的内容将给不同的模块去处理。 查询优化器的策略:
它使用的是 “选取-投影-联接” 策略进行查询。 用一个例子就可以理解: select uid,name from user where gender = 1; 这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行过滤这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤将这两个查询条件联接起来生成最终查询结果查询缓存往往弊大于利:因为mysql中的数据经常变化,所以使用缓存的命中率很低,mysql8删除了该功能。
3.第三层:存储引擎,负责数据的存储和提取,MySQL服务器通过API与存储引擎通信,屏蔽了各种引擎之间的差异,常见的存储引擎有:InnoDB、MyISAM。
MySQL 5.5之后,默认的存储引擎由MyISAM变为InnoDB。
-InnodbMyisam存储文件(1) .frm 表定义文件(2) .ibd 数据文件(1).frm 表定义文(2).myd 数据文件(3).myi 索引文件锁表锁、行锁表锁事务ACID不支持CRDU读、写读多count扫表专门存储的地方索引结构B+ TreeB+ Tree查看MySQL数据文件:SHOW VARIABLES LIKE '
