MySQL可以抽象分为 Server 和存储引擎。
Server 包括 连接器,分析器,优化器,执行器等。
存储引擎负责数据的存储和具体查询。存储引擎是可插拔式的,支持 InnoDB,MyISAM 等多个存储引擎。
连接器
连接器主要的作用是管理数据库的连接,以及连接时的鉴权操作。
客户端连接时,连接器会根据客户端传递的用户名和密码进行判断,如果用户名和密码不对,则会抛出 “Access denied for user”的错误。如果认证通过,会从权限表中查询用户的权限,这个连接的权限都依赖于此时查询到的权限。
使用 show processlist 可以查看MySQL的连接情况。对于空闲连接的处理,连接器会自动断开空闲连接,至于多长时间的空闲连接会自动断开,这个时间由参数wait_timeout控制的,默认值是8小时。
分析器
分析器会对MySQL的语句的语法进行分析,如果格式有问题,或者字段不存在会抛出一条 “You have an error in your SQL syntax” 的错误。
优化器
优化器会执行一些优化相关的操作,例如你的表中如果有多个索引,将会决定使用哪个索引,或者是连接查询中的一些表的连接顺序,做一些优化相关的操作。
执行器
经过了重重关卡,执行器首先会判断当前连接的这个用户是否具有操作该表的权限,如果没有则会抛出 “command denied to user ''root'localhost' for table 'test'“的错误。
如果有权限,打开表,根据表设置的引擎,调用该引擎的接口查询数据,将满足条件的数据作为结果返回给客户端。插入语句会涉及日志,过程和上述有所不同。
数据库的慢查询日志中看到一个rows_examined的字段,表示这个语句执行过程中扫描了多少行。这个值就是在执行器每次调用引擎获取数据行的时候累加的。