MySQL基本架构
其基本架构示意图如上图所示:
1,客户端:用户用来访问数据库的入口
2,proxy:代理服务器,很多高可用都是在代理上做文章,非必要存在,由的sql命令必须直连,不能使用代理,比如文件插入操作 ,必须使用直连的方式,不然需要导入的文件就会存储在proxy上,导致写入数据到DB时,找不到文件。
"load data local infile '{fileName}' ignore into table {databaseName}.{tableName} CHARACTER SET utf8 fields terminated by '|'"
3,连接器:连接器负责跟客户端建立连接、获取权限、维持和管理连接,proxy也是客户端的一种。
4,查询缓存:MySQL在执行查询的时候,会优先查询缓存,如果命中缓存,则直接返回。这个地方有个疑问:缓存的更新机制是怎样的,怎么保证一致性?猜测是在更新这条数据的时候清理掉缓存
正确的答案比这个更离谱:只要有一条更新,所有缓存就会失效。所以查询缓存的机制最好用在静态表场景,比如表中保存的是一些不常变化的配置数据(不过一般针对这种数据,都会放在缓存中,比如Redis)。MySQL 8.0 版本直接将查询缓存的整块功能删掉了,也就是说 8.0 开始彻底没有这个功能了。
5,分析器:词法和语法分析,分析器会判断表,字段是否存在。这个内部实现就比较复杂了,不做具体分析。
6,优化器:简单的来说就是有多个索引的时候决定选择哪个索引;多表关联的时候,表之间的连接顺序。优化器有时候优化的效果也会不好,曾经就遇到过一张表有多个索引,明显使用联合索引查询效率更快,结果优化器选择了单个索引,导致查询效率低,只好在查询的时候强制指定索引(force index “索引名称”)
7,执行器:验证相关权限,比如这个用户是否有查询权限。有的话,就根据建表是指定的存储引擎,调用对应的接口(InnoDB,MyISAM等),获取结果。