zoukankan      html  css  js  c++  java
  • MYSQL架构篇

    目标:
    掌握Mysql的各组件及各组件的功能
    理解Mysql简版执行流程和详细执行流程
    掌握MyIsam和InnoDB的区别并说明使用场景
    掌握Mysql日志文件及主要日志文件的作用
    理解Mysql的数据文件及作用
    使用命令查看mysql日志
    配置my.cnf开启二进制日志、通用查询日志、慢查询日志等
    掌握索引、分类、优劣势
    使用命令创建、查看、删除索引
    理解索引的原理和存储结构

    1. MySQL架构篇

    1.1 逻辑架构

    逻辑架构图:

    如上图俩圈圈,分为Server层和存储引擎层两部分。

    1.1.1 Server层

    涵盖MySQL的大多数核心服务功能,以及内置函数,存储过程、触发器、视图都在这一层实现。

    1) 连接器:

    负责跟客户端建立连接、获取权限、维持和管理连接。

    2) 查询缓存:

    MySQL拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。
    如果语句在查询缓存中,则直接返回之前的查询结果,如果不在,执行查询sql完成后,执行结果会被存入查询缓存中。
    但不建议使用,查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。

    3) 分析器:

    分析器先会做“词法分析”,“语法分析”,判断你输入的这个SQL语句是否满足MySQL语法

    4) 优化器:

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

    5) 执行器:

    开始执行的时候,要先判断一下你对这个表T有没有执行查询的权限,如果没有,就会返回没有权限的错误,如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

    1.1.2 存储引擎层

    负责数据的存储和提取,支持InnoDB、MyISAM、Memory等多个存储引擎。

    MyISAM:高速引擎,拥有较高的插入和查询速度,支持全文搜索和数据压缩,但不支持事务、不支持行锁、支持3种不同的存储格式。
    InnoDB:5.5版本后MySQL的默认数据库,支持事务和行级锁定,事务处理、回滚、崩溃修复能力和多版本并发控制的事务安全,比MyISAM处理速度稍慢、支持外键。

    InnoDB和MyISAM存储引擎区别

    1)存储引擎的选型:
    InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。
    如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。
    如需频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。
    MyISAM适用场景:

    • 非事务性场景(数据仓库,报表,日志数据)。
    • 只读类应用
    • 空间类应用

    同一个数据库也可以使用多种存储引擎的表。如果一个表要求比较高的事务处理,可以选择InnoDB。这个数据库中可以将查询要求比较高的表选择MyISAM存储。

    1.2物理架构

    MySQL是通过文件系统对数据和索引进行存储,从物理结构上可以分为日志文件和数据索引文件。
    日志文件采用顺序IO方式存储、数据文件采用随机IO方式存储
    顺序IO方式: 优点:记录速度快,只能追加,适合日志。劣势:占空间。
    随机IO方式:优点:省空间,适合数据+索引。劣势:相对慢。

    MySQL在Linux中的数据索引文件和日志文件都在/var/lib/mysql目录下。

    1.2.1日志文件

    a)错误日志(errorlog):

    记录了运行过程中遇到的所有严重的错误信息,以及 MySQL每次启动和关闭的详细信息。

    b)二进制日志(binlog):

    是逻辑日志,记录的是这个语句的原始逻辑(但不包括select语句内容)
    如果是DDL语句(CREATE、ALTER、DROP),则直接记录到binlog日志,而DML(增删改)语句,必须通过事务提交才能记录到binlog日志中。
    binlog会写入指定大小的物理文件中,是追加写入的,当前文件写满则会创建新的文件写入。

    c)重做日志(redo log)

    记录数据修改之后的值,用于持久化到磁盘中。
    redo log包括两部分:一是内存中的日志缓冲,该部分日志是易失性的;二是磁盘上的重做日志文件,该部分日志是持久的。由引擎层的InnoDB引擎实现,是物理日志,记录的是物理数据页修改的信息,比如“某个数据页上内容发生了哪些改动”。
    当一条数据需要更新时,InnoDB会先将数据更新,然后记录redoLog 在内存中,然后找个时间将redoLog的操作执行到磁盘上的文件上。不管是否提交成功我都记录,你要是回滚了,那我连回滚的修改也记录。它确保了事务的持久性。

    d)回滚日志(undo log)

    主要用于事务中执行失败,进行回滚。由引擎层的InnoDB引擎实现,是逻辑日志,记录数据修改被修改前的值,比如"把id='A'修改为id='B',那么undo日志就会用来存放id ='A'的记录”。
    当一条数据需要更新前,会先把修改前的记录存储在undolog中,如果这个修改出现异常,则会使用undo日志来实现回滚操作,保证事务的一致性。
    当事务提交之后,undo log并不能立马被删除,而是会被放到待清理链表中,待判断没有事物用到该版本的信息时才可以清理相应undolog。它保存了事务发生之前的数据的一个版本,用于回滚。

    e)慢查询日志(slow query log)

    SQL调优定位慢的 select,默认是关闭的。
    需要通过以下设置进行开启:

    #开启慢查询日志
    slow_query_log=ON
    #慢查询的阈值,记录执行时间超过3秒的所有查询,便于收集查询时间比较长的SQL语句
    long_query_time=3
    #日志记录文件如果没有给出file_name值, 默认为主机名,后缀为-slow.log。如果给出了文件名,但不是绝对路径名,文件则写入数据目录。
    slow_query_log_file=file_name
    

    1.2.2数据文件

    查看文件位置

    #查看文件位置
    SHOW VARIABLES LIKE '%datadir%';
    datadir	/u02/mysql/
    

    1.2.3InnoDB数据文件

    .frm文件:主要存放与表相关的数据信息,主要包括表结构的定义信息
    .ibd:使用独享表空间存储表数据和索引信息,一张表对应一个ibd文件。
    ibdata文件:使用共享表空间存储表数据和索引信息,所有表共同使用一个或者多个ibdata文
    件。

    1.2.4MyIsam数据文件

    .frm文件:主要存放与表相关的数据信息,主要包括表结构的定义信息
    .myd文件:主要用来存储表数据信息。
    .myi文件:主要用来存储表数据文件中任何索引的数据树

  • 相关阅读:
    spring boot @value 使用
    mac Navicat premium 链接oracle
    List sort 排序
    mac 配置jdk+maven环境变量
    mybatis 根据主键批量insert或update
    git 常用命令
    SpringBoot整合Activiti案例
    Activiti网关-并行网关
    Activiti网关-包含网关
    Activiti网关-排他网关
  • 原文地址:https://www.cnblogs.com/fuyublog/p/13958845.html
Copyright © 2011-2022 走看看