Mysql体系架构

文章目录

  • Mysql体系架构
    • 体系
      • 连接层
      • SQL处理层
      • 缓存
      • 解析查询
      • 优化
      • 逻辑架构
      • 物理存储结构
        • 数据库
        • 表文件
        • mysql utilities 安装
    • 存储引擎
      • MyISAM
        • 表压缩
        • 适用场景:
      • Innodb
      • CSV
      • Archive
      • Memory
        • 特点
      • 与临时表的区别
      • 使用场景

前文-MysqlJSON类型

Mysql体系架构

体系

Mysql体系架构_第1张图片

连接层

Mysql体系架构_第2张图片
当 MySQL 启动(MySQL 服务器就是一个进程),等待客户端连接,每一个客户端连接请求, 服务器都会新建一个线程处理(如果是线程池的话,则是分配一个空的线程),每个线程独 立,拥有各自的内存处理空间

最大连接数

show VARIABLES like '%max_connections%'

Mysql体系架构_第3张图片
连接到服务器,服务器需要对其进行验证,也就是用户名、IP、密码验证,一旦连接成功, 还要验证是否具有执行某个特定查询的权限(例如,是否允许客户端对某个数据库某个表的 某个操作)

SQL处理层

Mysql体系架构_第4张图片
这一层主要功能有:SQL 语句的解析、优化,缓存的查询,MySQL 内置函数的实现,跨存储 引擎功能(所谓跨存储引擎就是说每个引擎都需提供的功能(引擎需对外提供接口)),例如: 存储过程、触发器、视图等。

  • 1.如果是查询语句(select 语句),首先会查询缓存是否已有相应结果,有则返回结果,无则 进行下一步(如果不是查询语句,同样调到下一步)
  • 2.解析查询,创建一个内部数据结构(解析树),这个解析树主要用来 SQL 语句的语义与语 法解析;
  • 3.优化:优化 SQL 语句,例如重写查询,决定表的读取顺序,以及选择需要的索引等。这一
    阶段用户是可以查询的,查询服务器优化器是如何进行优化的,便于用户重构查询和修改相 关配置,达到最优化。这一阶段还涉及到存储引擎,优化器会询问存储引擎,比如某个操作 的开销信息、是否对特定索引有查询优化等。

缓存

show variables like '%query_cache_type%' #默认不开启
show variables like '%query_cache_size%' #默认值 1M
SET GLOBAL query_cache_type = 1; #会报错 
query_cache_type 只能配置在 my.cnf 文件中,这大大限制了 qc 的作用

在生产环境建议不开启,除非经常有 sql 完全一模一样的查询
QC 严格要求 2 次 SQL 请求要完全一样,包括 SQL 语句,连接的数据库、协议版本、字符 集等因素都会影响

解析查询

Mysql体系架构_第5张图片
Mysql体系架构_第6张图片

优化

Mysql体系架构_第7张图片
Mysql体系架构_第8张图片
Mysql体系架构_第9张图片
通过上面的 sql 大概就能看出,一个 sql 并 不一定会去查询物理数据,sql 解析器会通过优化器来优化程序员写的 sql

explain select * from account t where t.id in (select t2.id from account t2)
SHOW WARNINGS;

Mysql体系架构_第10张图片
Message信息:

/* select#1 */ 
SELECT `mall`.`t`.`id` AS `id`,`mall`.`t`.`name` AS `name`,`mall`.`t`.`balance` AS `balance` 
FROM `mall`.`account` `t2` JOIN `mall`.`account` `t` WHERE (`mall`.`t`.`id` = `mall`.`t2`.`id`)

可以看出子查询会被解析器优化成JOIN语句。
tips:面试问子查询和JOIN哪个效率高

逻辑架构

在 mysql 中其实还有个 schema 的概念,这概念没什么太多作用,只是为了兼容其他数据库, 所以也提出了这个。
在 mysql 中 database 和 schema 是等价的

create database demo; 
show databases; 
drop schema demo; 
show databases;

Mysql体系架构_第11张图片

物理存储结构

数据库的数据库(DataDir)
mysql 安装的时候都要指定 datadir,其查看方式为:
show VARIABLES like 'datadir',其规定所有建立的数据库存放位置
Mysql体系架构_第12张图片

数据库

创建了一个数据库后,会在上面的 datadir 目录新建一个子文件夹
Mysql体系架构_第13张图片

表文件

Mysql体系架构_第14张图片

用户建立的表都会在上面的目录中,它和具体的存储引擎相关,但有个共同的就是都有个 frm 文件,它存放的是表的数据格式。

mysqlfrm --diagnostic /usr/local/mysql/data/mall/account.frm

(对应下面的 mysql utilities 安装)
Mysql体系架构_第15张图片

mysql utilities 安装

分享链接
提取码:wdyb

tar -zxvf mysql-utilities-1.6.5.tar.gz 
cd mysql-utilities-1.6.5 
python ./setup.py build 
python ./setup.py install

存储引擎

#查看你的 mysql 现在已提供什么存储引擎:

mysql> show engines;

#看你的 mysql 当前默认的存储引擎:

mysql> show variables like '%storage_engine%';

MyISAM

MySql 5.5 之前默认的存储引擎
MyISAM 存储引擎由 MYD 和 MYI 组成

create table testmysam ( 
id int PRIMARY key 
) ENGINE=myisam 
insert into testmysam VALUES(1),(2),(3)

在这里插入图片描述

表压缩

myisampack -b -f /usr/local/mysql/data/mall/testmysam.MYI

压缩后再往表里面新增数据就新增不了
insert into testmysam VALUES(1),(2),(3)
Mysql体系架构_第16张图片
压缩后,需要

myisamchk -r -f /usr/local/mysql/data/mall/testmysam.MYI

适用场景:

  • 非事务型应用(数据仓库,报表,日志数据)
  • 只读类应用
  • 空间类应用(空间函数,坐标)
    由于现在 innodb 越来越强大,myisam 已经停止维护
    (绝大多数场景都不适合)

Innodb

  • Innodb 是一种事务性存储引擎
  • 完全支持事务得 ACID 特性
  • Redo Log 和 Undo Log
  • Innodb 支持行级锁(并发程度更高)
    Mysql体系架构_第17张图片
show VARIABLES like 'innodb_log_buffer_size'

CSV

  • 以 csv 格式进行数据存储
  • 所有列都不能为 null 的
  • 不支持索引(不适合大表,不适合在线处理)
  • 可以对数据文件直接编辑(保存文本文件内容)
create table mycsv(id int not null,c1 VARCHAR(10) not null,c2 char(10) not null) engine=csv;
insert into mycsv values(1,'aaa','bbb'),(2,'cccc','dddd');

vi /usr/local/mysql/data/mall/mycsv.CSV 修改文本数据

flush TABLES; 
select * from mycsv 
create index idx_id on mycsv(id)

Archive

  • 组成
    以 zlib 对表数据进行压缩,磁盘 I/O 更少
    数据存储在 ARZ 为后缀的文件中
  • 特点:
    只支持 insert 和 select 操作
    只允许在自增 ID 列上加索引
create table myarchive(id int auto_increment not null,c1 VARCHAR(10),c2 char(10), key(id)) engine = archive;
create index idx_c1 on myarchive(c1);
INSERT into myarchive(c1,c2) value('aa','bb'),('cc','dd');
delete from myarchive where id = 1;
update myarchive set c1='aaa' where id = 1;

Memory

特点

  • 文件系统存储特点 也称 HEAP 存储引擎,所以数据保存在内存中
  • 支持 HASH 索引和 BTree 索引
  • 所有字段都是固定长度 varchar(10) = char(10)
  • 不支持 Blog 和 Text 等大字段
  • Memory 存储引擎使用表级锁
  • 最大大小由 max_heap_table_size 参数决定
show VARIABLES like 'max_heap_table_size'
create table mymemory(id int,c1 varchar(10),c2 char(10),c3 text) engine = memory; 
create table mymemory(id int,c1 varchar(10),c2 char(10)) engine = memory;
 create index idx_c1 on mymemory(c1); 
 create index idx_c2 using btree on mymemory(c2); 
 show index from mymemory 
 show TABLE status LIKE ‘mymemory’

与临时表的区别

Mysql体系架构_第18张图片

使用场景

  • hash 索引用于查找或者是映射表(邮编和地区的对应表)
  • 用于保存数据分析中产生的中间表
  • 用于缓存周期性聚合数据的结果表

你可能感兴趣的:(SQL,Mysql体系架构,存储引擎,学习记录,知识分享,SQL)