MYSQL篇-02-MYSQL的介绍和存储引擎

139 阅读9分钟

1、MySQL结构

MySQL 可以分为 Server 层和存储引擎层两部分
Server层主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数 (如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
Store层存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。也就是说如果我们在create table时不指定 表的存储引擎类型,默认会给你设置存储引擎为InnoDB。

2、连接器

MySQL客户端:navicat,mysql front,jdbc,SQLyog等,这些客户端要向mysql发起通信都必须先跟Server端建立通信连接,而建立连接的工作就是有连接器完成的。 ba

用户要连接到数据库上,这时候接待你的就是连接器。连接器负责跟客户端建立连接、获取权限、维持和管理连接。

mysql ‐h host[数据库地址] ‐u root[用户]p root[密码]P 3306

连接命令中的 mysql 是客户端工具,用来跟服务端建立连接。在完成经典的 TCP 握手后,连接器就要开始认证你的身份,

这个时候用的就是你输入的用户名和密码。

1、如果用户名或密码不对,你就会收到一个"Access denied for user"的错误,然后客户端程序结束执行。

2、如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。

这就意味着,一个用户成功建立连接后,即使你用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权 限。修改完成后,只有再新建的连接才会使用新的权限设置。用户的权限表在系统表空间的mysql的user表中。客户端如果长时间不发送command到Server端,连接器就会自动将它断开。这个时间是由参数 wait_timeout 控制的,默认值 是 8 小时。

3、查询缓存(mysql8.0已经移除了查询缓存功能)

MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找 到 key,那么这个 value 就会被直接返回给客户端。

如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。你可以看到,如果查 询命中缓存,MySQL 不需要执行后面的复杂操作,就可以直接返回结果,这个效率会很高。

大多数情况查询缓存就是个鸡肋,为什么呢?

因为查询缓存往往弊大于利。查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。因此很可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。对于更新压力大的数据库来说,查询缓存的命中率会非常低。

一般建议大家在静态表里使用查询缓存,什么叫静态表呢?就是一般我们极少更新的表。比如,一个系统配置表、字典表,那这张表上的查询才适合使用查询缓存。好在 MySQL 也提供了这种“按需使用”的方式。你可以将my.cnf参数 query_cache_type 设置成 DEMAND。

my.cnf
#query_cache_type有3个值 0代表关闭查询缓存OFF,1代表开启ON,2(DEMAND)代表当sql语句中有SQL_CACHE
关键词时才缓存
query_cache_type=2

这样对于默认的 SQL 语句都不使用查询缓存。而对于你确定要使用查询缓存的语句,可以用 SQL_CACHE 显式指定,像下 面这个语句一样:

// 显示添加缓存
select SQL_CACHE * from test where ID=5; 
// 查看当前mysql实例是否开启缓存机制
show global variables like "%query_cache_type%"; 
// 监控查询缓存的命中率:查看运行的缓存信息
show status like'%Qcache%'; 
运行的缓存信息
Qcache_free_blocks表示查询缓存中目前还有多少剩余的blocks,如果该值显示较大,则说明查询缓存中的内存碎片 过多了,可能在一定的时间进行整理
Qcache_free_memory查询缓存的内存大小,通过这个参数可以很清晰的知道当前系统的查询内存是否够用,是多 了,还是不够用,DBA可以根据实际情况做出调整
Qcache_hits表示有多少次命中缓存。我们主要可以通过该值来验证我们的查询缓存的效果。数字越大,缓存效果越 理想。
Qcache_inserts表示多少次未命中然后插入,意思是新来的SQL请求在缓存中未找到,不得不执行查询处理,执行 查询处理后把结果insert到查询缓存中。这样的情况的次数,次数越多,表示查询缓存应用到的比较少,效果也就不理 想。当然系统刚启动后,查询缓存是空的,这很正常。
Qcache_lowmem_prunes该参数记录有多少条查询因为内存不足而被移除出查询缓存。通过这个值,用户可以适当的 调整缓存大小。
Qcache_not_cached表示因为query_cache_type的设置而没有被缓存的查询数量。 Qcache_queries_in_cache:当前缓存中缓存的查询数量。
Qcache_total_blocks当前缓存的block数量。

4、分析器

词法分析器分成6个主要步骤完成对sql语句的分析:

1、词法分析 2、语法分析 3、语义分析 4、构造执行树 5、生成执行计划 6、计划的执行

SQL语句的分析分为词法分析与语法分析,mysql的词法分析由MySQL Lex[MySQL自己实现的]完成,语法分析由Bison生成。关于语法树深入研究可以参考这篇wiki文章:

en.wikipedia.org/wiki/LR_par…

那么除了Bison 外,Java当中也有开源的词法结构分析工具例如Antlr4,ANTLR从语法生成一个解析器,可以构建和遍历解析树,可以在IDEA 工具当中安装插件:

antlr v4 grammar plugin。

5、优化器

优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。

6、执行器

7、bin-log归档

①、statement,row,mixed(三种模式)

statement:记录所以sql语句(除了select)

row:记录行记录前后的变化

mixed:混合模式

②、binlog相关配置

binlog是Server层实现的二进制日志,他会记录我们的cud操作。Binlog有以下几个特点:

1、Binlog在MySQL的Server层实现(引擎共用) 。

2、Binlog为逻辑日志,记录的是一条语句的原始逻辑 。

3、Binlog不限大小,追加写入,不会覆盖以前的日志。

查看是否开启binlog

show variables like '%log_bin%';

-- 会多一个最新的bin‐log日志
flush logs; 

-- 查看最后一个bin‐log日志的相关信息
show master status; 

-- 清空所有的bin‐log日志
reset master;

-- 配置开启binlog 位置
log‐bin=/usr/local/mysql/data/binlog/mysql‐bin

-- 注意5.7以及更高版本需要配置本项:server‐id=123454(自定义,保证唯一性);
-- binlog格式,有3种statement,row,mixed
binlog‐format=ROW

-- 表示每1次执行写入就与硬盘同步,会影响性能,为0时表示,事务提交时mysql不做刷盘操作,由系统决定
sync‐binlog=1
    
    -- 查看binlog内容
/usr/local/mysql/bin/mysqlbinlog ‐‐no‐defaults /usr/local/mysql/data/binlog/mysql‐bin.000001

binlog里的内容不具备可读性,所以需要我们自己去判断恢复的逻辑点位

③、从bin‐log恢复数据

恢复全部数据

/usr/local/mysql/bin/mysqlbinlog ‐‐no‐defaults /usr/local/mysql/data/binlog/mysql‐bin.000001 |mysql ‐uroot ‐p tuling(数据库名)

恢复指定位置数据

/usr/local/mysql/bin/mysqlbinlog ‐‐no‐defaults ‐‐start‐position="408" ‐‐stop‐position="731"
/usr/local/mysql/data/binlog/mysql‐bin.000001 |mysql ‐uroot ‐p tuling(数据库)

恢复指定时间段数据

/usr/local/mysql/bin/mysqlbinlog ‐‐no‐defaults /usr/local/mysql/data/binlog/mysql‐bin.000001 ‐‐stop‐date= "2018‐03‐02 12:00:00" ‐‐start‐date= "2019‐03‐02 11:55:00"|mysql ‐uroot ‐p test(数据库)

三、MySQL存储引擎

1、查看引擎

 show engines;

结果如图有9种:

InnoDB(默认)MyISAMMemory
文件frm文件:表结构放在IBD文件:数据和索引放在其中frm文件:存储表的定义数据myd文件:存放表具体记录的数据myi文件:存储索引文件是frm
支持内容1、可以通过自动增长列2、支持事务。默认的事务隔离级别为可重复度3、使用的锁粒度为行级锁,可以支持更高的并发4、支持外键约束;5、存在着缓冲管理,加快查询的速度6、数据和索引放在一块,都位于B+数的叶子节点上1、支持全文索引2、B树索引3、数据压缩1、支持的数据类型有限制2、支持的锁粒度为表级锁3、默认使用hash索引

2、查询mysql自己维护的总行数

对于myIsam存储引擎的表做不带where条件的count查询性能是很高的,因为myisam存储引擎的表的总行数会被

mysql存储在磁盘上,查询不需要计算。

3、DDL和DML区别

DML(Data Manipulation Language)数据操纵语言:适用范围:对数据库中的数据进行一些简单操作,如insert,delete,update,select等。

DDL(Data Definition Language)数据定义语言:适用范围:对数据库中的某些对象(例如,database,table)进行管理,如Create。Alter和Drop。

区别:

1、DML操作是可以手动控制事务的开启、提交和回滚的。

2、DDL操作是隐性提交的,不能rollback。