整体架构
client connectors:
mysql提供各种语言连接客户端api,client发送sql语句到server端进行执行
连接器(Connectors):连接器负责客户端与服务端进行连接,使用mysql协议或X协议使得客户端可以通过api能够访问mysql底层资源,执行sql语句。mysql提供多种语言的连接器,基本上常见的语言都有。
连接控制:当客户端连接数据库时,会根据服务端配置来校验当前客户端允不允许连接数据库,比如ip配置是否运行,是否达到最大连接数等。
用户认证:校验登录用户名密码信息,IP或者可能的证书信息。
权限校验:获取当前用户操作权限、每次在分析发送sql语句前校验当前用户是否有对应数据操作权限。
MySQL Server (mysqld)
mysqld是服务端主要的程序,包含有以下几个服务功能。
SQL接口(SQL Interface):所有数据库可执行语句,包括DML、DDL、存储过程、视图、触发器等的语法接口定义。还有内置函数定义。这些东西都是跨存储引擎的。都是在mysqld中定义实现的。
分析器(Query Parser):一条语句发送到服务端,首先会分析sql语句的语法是否正确,将整个语句解析成不同的部分,供后面执行使用。
优化器(Query Optimizer):对解析后的sql语句不同的执行计划进行评估,选择合适的执行计划来提高数据库执行效率。比如多个索引时如何使用索引,多个表关联查询时关联顺序是怎样的。这个时候一些执行计划的统计及耗时记录是有存储引擎来完成的,优化器会和具体执行引擎进行交互来选择效率高的执行计划。
缓存和缓冲区(Caches & Buffers):这里缓存的种类有很多。像缓存了打开的表的信息,避免频繁的打开和关闭表。存储引擎的数据缓存,查询缓存等等有很多。主要是为了提高性能。
存储引擎
存储引擎负责数据库中数据的存储、提取和管理。mysql存储引擎是插件式的模式,用户可以方便使用不同的存储引擎,常见存储引擎InnoDB、MyISAM、Memory等。在创建表时候可以使用ENGINE=InnoDB来指定使用存储引擎,从5.5版本开始,默认存储引擎是InnoDB。
文件系统
文件系统存储不同类型数据。有数据文件、索引文件、日志文件等。
查询语句执行顺序
1、首先是from,join来确定表和数据范围
2、where对数据进行筛选过滤
3、group by分组和having过滤
4、select抽取对应的列,如果有DISTINCT 进行去重。
5、合并各组的结果进行order by 排序
6、LIMIT限制返回的行数