六、Mysql体系架构、存储引擎、临时表
文章目录
- Mysql体系架构
- 体系
- 连接层
- SQL处理层
- 缓存
- 解析查询
- 优化
- 逻辑架构
- 物理存储结构
- 数据库
- 表文件
- mysql utilities 安装
- 存储引擎
- MyISAM
- 表压缩
- 适用场景:
- Innodb
- CSV
- Archive
- Memory
- 特点
- 与临时表的区别
- 使用场景
- Ferderated
前文-MysqlJSON类型
Mysql体系架构
体系
连接层
当 MySQL 启动(MySQL 服务器就是一个进程),等待客户端连接,每一个客户端连接请求, 服务器都会新建一个线程处理(如果是线程池的话,则是分配一个空的线程),每个线程独 立,拥有各自的内存处理空间
最大连接数
show VARIABLES like '%max_connections%'
连接到服务器,服务器需要对其进行验证,也就是用户名、IP、密码验证,一旦连接成功, 还要验证是否具有执行某个特定查询的权限(例如,是否允许客户端对某个数据库某个表的 某个操作)
SQL处理层
这一层主要功能有: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 语句,连接的数据库、协议版本、字符 集等因素都会影响
解析查询
优化
通过上面的 sql 大概就能看出,一个 sql 并 不一定会去查询物理数据,sql 解析器会通过优化器来优化程序员写的 sql
explain select * from account t where t.id in (select t2.id from account t2)
SHOW WARNINGS;
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;
物理存储结构
数据库的数据库(DataDir)
mysql 安装的时候都要指定 datadir,其查看方式为:
show VARIABLES like 'datadir'
,其规定所有建立的数据库存放位置
数据库
创建了一个数据库后,会在上面的 datadir 目录新建一个子文件夹
表文件
用户建立的表都会在上面的目录中,它和具体的存储引擎相关,但有个共同的就是都有个 frm 文件,它存放的是表的数据格式。
mysqlfrm --diagnostic /usr/local/mysql/data/mall/account.frm
(对应下面的 mysql utilities 安装)
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)
压缩后,需要
myisamchk -r -f /usr/local/mysql/data/mall/testmysam.MYI
适用场景:
- 非事务型应用(数据仓库,报表,日志数据)
- 只读类应用
- 空间类应用(空间函数,坐标)
由于现在 innodb 越来越强大,myisam 已经停止维护
(绝大多数场景都不适合)
Innodb
- Innodb 是一种事务性存储引擎
- 完全支持事务得 ACID 特性
- Redo Log 和 Undo Log
- Innodb 支持行级锁(并发程度更高)
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’
与临时表的区别
使用场景
- hash 索引用于查找或者是映射表(邮编和地区的对应表)
- 用于保存数据分析中产生的中间表
- 用于缓存周期性聚合数据的结果表
Ferderated
- 提供了访问远程 MySQL 服务器上表的方法
- 本地不存储数据,数据全部放到远程服务器上
- 本地需要保存表结构和远程服务器的连接信息
使用场景
- 偶尔的统计分析及手工查询(某些游戏行业)
默认禁止,启用需要再启动时增加 federated 参数
show ENGINES;
create database local;
create database remote;
create table remote_fed(id int auto_increment not null,c1 varchar(10) not null default '',c2 char(10) not null default '',primary key(id)) engine = INNODB ;
INSERT into remote_fed(c1,c2) values('aaa','bbb'),('ccc','ddd'),('eee','fff');CREATE TABLE `local_fed` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`c1` varchar(10) NOT NULL DEFAULT '',
`c2` char(10) NOT NULL DEFAULT '',
PRIMARY KEY (`id`) ) ENGINE=federated CONNECTION ='mysql://root:root1234%@127.0.0.1:3306/remote/remote_fed'
select * from local_fed;
delete from local_fed where id = 2;select * from remote.remote_fed;
六、Mysql体系架构、存储引擎、临时表相关推荐
- 阿里P8架构师谈:MySQL有哪些存储引擎,各自的优缺点,应用场景
经常面试都会问到MYSQL有哪些存储引擎,以及各自的优缺点.今天主要分享常见的存储引擎:MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(BerkeleyDB)等,以及最常用的 ...
- mysql递归查询所有上下节点_【转】MySQL之Spider存储引擎原理详解
一.概述 Spider是为MySQL/MariaDB开发的一个特殊引擎,具有内嵌分片功能.MariaDB从10.0.4开始支持Spider.作为MariaDB的一个新的主要特性.Spider的主要功能 ...
- tablestore列式存储原理_10分钟搞透:技术人必会的MySQL体系结构与存储引擎!
MySQL是目前使用最广的开源数据库,不管从装机量.使用人群.专职人员.社区发展,还是基于MySQL的其他分支,都是当之无愧的No.1. 本文将从以下4个方面,带你搞透MySQL体系结构与存储引擎. ...
- mysql 学习笔记--存储引擎、索引、sq优化
全面的 mysql学习笔记–通用语法.函数.数据类型.约束.多表查询.事务 全面的 mysql学习笔记–存储引擎.索引.sql优化 全面的mysql学习笔记–视图/存储过程/触发器.锁.InnoDB引 ...
- mysql技术innodb存储引擎读后感_《MySQL技术内幕:InnoDB存储引擎》读书笔记.
一.MySQL 体系架构和存储引擎 1.MySQL 被设计成一个单进程多线程架构的数据库,MySQL 数据库实例在系统上的表现就是一个进程. 2.MySQL 的体系架构,需要特别注意的是,存储引擎是基 ...
- mysql的常用存储引擎_MySQL常见的三种存储引擎
Ok,我们知道了,引擎就是一个程序的核心组件. 简单来说,存储引擎就是指表的类型以及表在计算机上的存储方式. 存储引擎的概念是MySQL的特点,Oracle中没有专门的存储引擎的概念,Oracle有O ...
- MySQL技术内幕读书笔记(一)——Mysql体系结构和存储引擎
目录 MySQL体系结构和存储引擎 定义数据库和实例 MYSQL体系结构 MYSQL存储引擎 MySQL体系结构和存储引擎 定义数据库和实例 数据库:物理操作系统文件或者其他形式文件类型的结合.在MY ...
- MySQL高级-(存储引擎、索引、锁)
MySQL高级 一.MySQL存储引擎 1.MySQL体系结构 体系结构的概念 任何一套系统当中,每个部件都能起到一定的作用! MySQL的体系结构 体系结构详解 客户端连接 支持接口:支持的客户端连 ...
- 一文搞懂MySQL体系架构!!
写在前面 很多小伙伴工作很长时间了,对于MySQL的掌握程度却仅仅停留在表面的CRUD,对于MySQL深层次的原理和技术知识了解的少之又少,随着工作年限的不断增长,职场竞争力却是不断降低的.很多时候, ...
最新文章
- 宏定义define的使用
- 清空SQL Server日志
- nice和taskset命令
- Error: Could not find or load main class
- 错误之Only one usage of each socket address (protocol/network address/port)解决办法
- mysql 页面跳转_Springboot+MyBatis+mysql+jsp页面跳转详细示例
- 阿里云oss上传图片
- linux msgctl函数,msgctl()函数
- Office2010安装出现“错误1907”的解决方法(未验证)
- Hercules配置文件HERCULES.CNF范本
- ict的终极模式 是软件研发
- N70常用软件大集合
- 【RFID】RFID的标准体系
- 从董明珠称格力将会接入鸿蒙系统,是否可以看出手机圈的不堪?
- js-cookie设置token过期时间
- 到底什么才是商业智能(BI)?数字化时代你应该了解这些
- 初探Meterpreter-emaste_r
- 【Oracle数据库驱动架包 ojdbc5.jar ojdbc6.jar】
- 流氓软件插件中介商自述黑色淘金路(转)
- 微信小程序黑马优购遇到的问题和心得
热门文章
- python怎么清空屏幕_python3.6怎么清屏幕
- Halcon——使用标定板标定像素当量
- [Usaco2008 Mar]River Crossing渡河问题
- java中文转Unicode
- UDP报文观测以及DNS的工作原理
- win10屏蔽自动更新方法
- 跟KingDZ学HTML5之八 HTML5之Web Save
- 无法将mysql服务器连接到_无法从java连接到mysql服务器
- php多表条件排除然后输出,php – 从具有多个要求的两个表中选择值,但仅使用其中一个...
- MySQL中实现rownum功能类似的语句