MySQL 可以分为 Server 层和存储引擎层两部分。Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL5.5.5 版本开始成为了默认存储引擎。!

mysql查询语句执行流程--丁奇老师mysql实战笔记_mysql查询语句

  1. 连接器:连接器负责跟客户端建立连接、获取权限、维持和管理连接。
    命令:mysql -h i p − P ip -P ip−Pport -u$user -p
    建立连接后,需改已连接的用户的权限,权限不会变化,需要重新建立连接,权限才会改变。
    当连接完成后,没有操作处于空闲状态。则可通过 show processlist 查看进程,可看到进程的command 列的状态为sleep
    若长时间处理sleep 状态的进程,mysql会自动断开,断开时间由 wait_timeout 参数的值决定。 默认是8h。
注:数据库的长连接是指连接成功后,如果客户端有持续请求,就一直使用同一个连接。短链接是指每次执行完几个请求后就断开连接,下次请求是重新建一个。由于建立连接的过程比较复制,建议减少建立连接的请求。使用长连接会出现有时候mysql的内存用的快,这是由于mysql在执行过程中临时使用的内存是管理在连接对象里,这些资料会在断开连接时释放。所有长连接积累下来,会导致内存占用过大,而被系统强行kill,就是mysql看起来是异常重启了。
思考:如何解决长连接导致mysql异常重启的问题?
a、定期断开长连接。在使用一段时间、或程序里判断执行过一个占用内存的大查询后,断开连接,之后要查询再连接。
b、如mysql版本5.7+,可以在每次执行一个比较大的操作后,通过执行mysql_rset_connect来重新初始化连接资源。这个过程不需要重连和重新验证权限,会将连接恢复到刚连接的状态。

2.查询缓存:查询若命中查询缓存就会直接返回结果。查询缓存有个致命缺陷:就是查询缓存频繁失效,当表数据更新时,保存的查询缓存就会被清空。建议对于数据变化不大的表可以使用查询缓存。mysql8.0之后,查询缓存会被删掉。

3.分析器:包括词法分析、语法分析

词法分析:识别字符串组成的sql语句,得到需要执行的sql是属于select、delete、update等。
语法分析:根据词法分析的结果,判断输入语句是否符合mysql语法,不符合就会抛出异常。

4.优化器:是根据sql语句自动去选择多个索引中的最优索引、或是关联查询的表连接顺序。

5.执行器:经过分析器判断语法是否正确、优化器拿到系统选择的最优执行计划,mysql会根据结果开始执行sql,返回执行结果。