逻辑架构
逻辑架构图
-
连接器(Connectors)
-
系统管理和控制工具(Management Serveices & Utilities)
-
连接池(Connection Pool)
SQL Layer MySQL业务层 -
SQL接口(SQL Interface)
接收SQL DML DDL语句 -
解析器(Parser)
例如:select * from t1
词法分析 分词 =====>>> 形成语法树
语法分析 分析 (符合SQL的语法 SQL的语法 SQL 92; limit 是MYSQL自己的语法)
例如(elect * from t1) 在此阶段被验证语法错误 sytnx error …
最后形成正确语法树 -
查询优化器(Optimizer)
Mysql 会觉得你写的SQL 不是完美的,所以会进行SQL优化,具体优化什么呢?
例:
多索引时 只使用一个最优的,可通过explain查看
多表关联 小表驱动大表
where 从左到右执行,但 MySQL 会优化寻找过滤力度最大的先执行
如:where sex=‘男’ and id=1,会被优化为 where id=1 and sex=‘男’
Oracle where条件是从右到左 -
查询缓存(Cache和Buffer)
把查询结果存起来
select * from tuser where id=1
Map结构缓存其中Key值为DQL语句的hash值
hash(select语句) 查询结果
1、sql有变化,hash值不等则无法获取缓存结果
2、缓存对应的表数据有变化,缓存清除
MySQL8.0后不再使用 -
存储引擎(Pluggable Storage Engines)
如:
creat table xxx() engine=InnoDB/Memory/MyISAM
MySQL的存储引擎是针对表进行指定的。(engine=InnoDB\myisam)
存储引擎 | 说明 |
---|---|
MyISAM | 高速引擎,拥有较高的插入,查询速度,但不支持事务、不支持行锁、支持3种不同的存储格式。包括静态型、动态型和压缩型 |
InnoDB | 5.5版本后MySQL的默认数据库,支持事务和行级锁定,事务处理、回滚、崩溃修复能力和多版本并发控制的事务安全,比MyISAM处理速度稍慢、支持外键(FOREIGN KEY) |
ISAM | MyISAM的前身,MySQL5.0以后不再默认安装 |
MRG_MyISAM(MERGE) | 将多个表联合成一个表使用,在超大规模数据存储时很有用 |
Memory | 内存存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。只在内存上保存数据,意味着数据可能会丢失 |
Falcon | 一种新的存储引擎,支持事物处理,传言可能是InnoDB的替代者 |
Archive | 将数据压缩后进行存储,非常适合存储大量的独立的,作为历史记录的数据,但是只能进行插入和查询操作 |
CSV | CSV 存储引擎是基于 CSV 格式文件存储数据(应用于跨平台的数据交换) |
xtraDB存储引擎是由Percona公司提供的存储引擎,该公司还出品了Percona Server这个产品,它是基
于MySQL开源代码进行修改之后的产品。
阿里对于Percona Server服务器进行修改,衍生了自己的数据库(alisql)。
InnoDB和MyISAM存储引擎区别:
Innodb | Myisam | |
---|---|---|
存储文件 | .frm 表定义文件 .ibd 数据文件和索引文件 | .frm 表定义文件 .myd 数据文件 .myi 索引文件 |
锁 | 表锁、行锁 | 表锁 |
事务 | 支持 | 不支持 |
CRUD | 读、写 | 读多 |
COUNT | 扫表 | 单独存储总数(Where也扫表) |
索引结构 | B+Tree | B+Tree |
外键 | 支持 | 不支持 |
存储引擎的选型:
InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚
(rollback)。
MyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择
MyISAM能实现处理高效率。如果应用的完整性、并发性要求比 较低,也可以使用。
MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,不需要持久保存,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。
注意,同一个数据库也可以使用多种存储引擎的表。如果一个表要求比较高的事务处理,可以选择
InnoDB。这个数据库中可以将查询要求比较高的表选择MyISAM存储。如果该数据库需要一个用于查询
的临时表,可以选择MEMORY存储引擎。
详细执行流程图
物理结构
- MySQL是通过文件系统对数据和索引进行存储的。
- MySQL从物理结构上可以分为日志文件和数据索引文件。
- MySQL在Linux中的数据索引文件和日志文件都在/var/lib/mysql目录下。
- 日志文件采用顺序IO方式存储、数据文件采用随机IO方式存储。
记录 | 优点 | 缺点 | |
---|---|---|---|
顺序IO | 首地址、偏移量 | 记录速度快、只能追加 | 浪费空间 |
随机IO | 地址 | 节省空间 | 相对较慢 |
日志文件
错误日志(errorlog)
默认是开启的,而且从5.5.7以后无法关闭错误日志,错误日志记录了运行过程中遇到的所有严重的错误信息,以及 MySQL每次启动和关闭的详细信息。
二进制日志(bin log)
记录数据变化
binlog记录了数据库所有的DDL语句和DML语句,但不包括select语句内容,语句以事件的形式保存,描述了数据的变更顺序,binlog还包括了每个更新语句的执行时间信息。如果是DDL语句,则直接记录到binlog日志,而DML语句,必须通过事务提交才能记录到binlog日志中,一般在生产中开启。
用于数据备份、恢复、主从
通用查询日志(general query log)
记录所有SQL,比较耗性能,建议生产中不开启
慢查询日志(slow query log)
SQL调优 定位慢的 select
默认是关闭的。
需要通过以下设置进行开启:
#开启慢查询日志
slow_query_log=ON
#慢查询的阈值
long_query_time=3
#日志记录文件如果没有给出file_name值, 默认为主机名,后缀为-slow.log。如果给出了文件名,但不
是绝对路径名,文件则写入数据目录。
slow_query_log_file=file_name
记录执行时间超过long_query_time秒的所有查询,便于收集查询时间比较长的SQL语句
重做日志(redo log)
回滚日志(undo log)
中继日志(relay log)
查看日志开启情况:
show variables like ‘log_%’;
数据文件
show variables like’%datadir%’;
InnoDB数据文件:
- .frm文件:主要存放与表相关的数据信息,主要包括表结构的定义信息
- .ibd:使用独享表空间存储表数据和索引信息,一张表对应一个ibd文件。
- ibdata文件:使用共享表空间存储表数据和索引信息,所有表共同使用一个或者多个ibdata文
件。
MyIsam数据文件:
- .frm文件:主要存放与表相关的数据信息,主要包括表结构的定义信息
- .myd文件:主要用来存储表数据信息。
- .myi文件:主要用来存储表数据文件中任何索引的数据树。
转载:https://blog.csdn.net/qq_33382373/article/details/101690558