MySQL逻辑架构简介

MySQL逻辑架构简介

分层解耦,高内聚低耦合

image

● Connectors:指的是不同语言中与SQL的交互。
● Connection Pool:管理缓冲用户连接,线程处理等需要缓存的需求。MySQL数据库的连接层。
● Management Serveices & Utilities:系统管理和控制工具。备份、安全、复制、集群等等。。
● SQL Interface:接受用户的SQL命令,并且返回用户需要查询的结果。
● Parser:SQL语句解析器。
● Optimizer:查询优化器,SQL语句在查询之前会使用查询优化器对查询进行优化。就是优化客户端请求query,可能正真执行的顺序和客服端的顺序不一样。
● Caches & Buffers:查询缓存。
● Pluggable Storage Engines:存储引擎接口。MySQL区别于其他数据库的最重要的特点就是其插件式的表存储引擎
mysql支持大多数的存储引擎,表存储引擎类似U盘,需要那种就插入哪种。存储引擎是基于表的,而不是数据库
● File System:数据落地到磁盘上,就是文件的存储。

和其他数据库相比,MySQL有点与众不同,主要体现在存储引擎的架构上,这种架构可以根据业务的需求和实际需求选择合适的存储引擎。

逻辑架构分层

image

● 连接层:最上层是一些客户端和连接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于tcp/ip的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
● 服务层:MySQL的核心服务功能层,该层是MySQL的核心,包括查询缓存,解析器,解析树,预处理器,查询优化器。主要进行查询解析、分析、查询缓存、内置函数、存储过程、触发器、视图等,select操作会先检查是否命中查询缓存,命中则直接返回缓存数据,否则解析查询并创建对应的解析树。
● 引擎层:存储引擎层,存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。
● 存储层:数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。

存储引擎

查看引擎

mysql> show engines;  # 查看支持的存储引擎

mysql> show variables like '%storage_engine%'; # 查看目前的引擎相关设置
+---------------------------------+-----------+
| Variable_name                   | Value     |
+---------------------------------+-----------+
| default_storage_engine          | InnoDB    |
| default_tmp_storage_engine      | InnoDB    |
| disabled_storage_engines        |           |
| internal_tmp_mem_storage_engine | TempTable |
+---------------------------------+-----------+
4 rows in set (0.01 sec)

image

InnoDB和MyISAM的区别

引擎类型 MyISAM InnoDB
外键 ×
事务 ×
支持表锁
支持行锁
索引 非聚簇索引 聚簇索引
缓存 只缓存索引,不缓存真实数据 不仅缓存索引还要缓存真实数据,対内存要求较高,而且内存大小対性能有决定性影响
表空间
关注点 性能,适合操作大量select 事务,适合操作大量insert、delete、updata
支持全文索引
默认安装

说明

1.表锁,即使操作一条记录也会锁住整张表,不适合高并发操作。行锁,操作时只锁某一行,不对其他行有影响,适合高并发操作

2.mysql8.0取消了查询缓存

mysql 里面的缓存是查询缓存,可以把我们查询过的语句缓存下来,下一次查询的时候有可能就直接从缓存返回

尽管MySQL Query Cache旨在提高性能,但它存在严重的可伸缩性问题,并且很容易成为严重的瓶颈。
自MySQL 5.6(2013)以来,默认情况下已禁用查询缓存,因为众所周知,它不能与多核计算机上在高吞吐量工作负载情况下进行扩展。
查询缓存的失效非常频繁,只要有对一个表的更新,这个表上的所有的查询缓存都会被清空。
建议把缓存放到客户端,建议使用服务器端查询重写或ProxySQL作为中间人缓存

posted @ 2021-12-24 10:03  rananie  阅读(74)  评论(0)    收藏  举报