mysql高级

  • 前言
  • 逻辑架构
    • 介绍
    • 执行流程
  • 存储引擎
    • InnoDB
    • MyISAM
    • Archive
    • Blackhole
    • CSV
    • Memory
    • 其他
      • Federated
      • Merge
      • NDB
    • 引擎对比
  • end...

前言

废话不多说,直接开干。文章课程链接:MySQL数据库教程天花板,mysql安装到…

逻辑架构

介绍

mysql 是典型的 C/S架构,服务器端使用的mysqld
一个查询语句是如何执行的,它会经过哪些步骤,首先客户端与mysql服务建立连接,进入SQL接口,查询缓存,有则返回结果,否则继续,这时候会经历解析器解析,优化器优化,到具体的文件系统进行查找,最终返回数据。
可以将这个查询过程分为三层,分别连接层、服务层、引擎层,下面一一进行学习

连接层
1、与服务器通过三次握手建立tcp连接
2、身份认证、权限读取
在建立连接时,mysql服务会用tcp连接池限制连接数量,为连接分配线程

服务层
1、sql interface:sql接口

接收sql命令,并返回用户需要查询的结果

2、parser:解析器

对sql语句进行语法分析、语义分析,为其创建语法树,如果sql有误,会在这里返回。验证客户端是否具有执行该查询的权限,还会对sql查询进行语法上的优化,进行查询重写

3、Optimizer:查询优化器

sql语句在语法解析之后,查询之前会使用查询优化器确认sql语句的执行路径,生成一个执行计划,这个执行计划包括应该使用哪些索引进行查询(全表还是索引),表之间的连接顺序如何,最后会按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将查询结果返回给用户,它使用“选取-投影-连接”策略进行查询。

4、Caches & Buffers:查询缓存组件

通过缓存查询结果来达到快速的查询,这个缓存机制是由一系列小缓存组成的,比如表缓存,记录缓存、key缓存、权限缓存,查询缓存可以在不同客户端之间共享,从5.7.2开始,不推荐使用查询缓存(命中率太低),并在mysql 8.0 中被删除。

引擎层
与其他数据库相比,mysql有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用,主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其他的系统任务以及数据库的存储提取相分离,这种架构可以根据业务的需求和实际需要选择合适的存储引擎,同时mysql还允许开发人员设置自己的存储引擎。
插件式的存储引擎层(Storage Engines),真正的负责了mysql中数据的存储和提取、对物理服务器级别维护的底层数据执行操作,服务器通过api与存储引擎进行通信。
通过 show engines 查看存储引擎

执行流程

一个mysql大致的执行流程如下
1、客户端与mysql服务建立连接,不同的语言使用不同的方式,如java使用jdbc
2、从连接池中分配一个线程,用于处理sql语句
3、进入SQL接口(该接口用于接收SQL指令,返回SQL查询结果)
4、查询缓存,看这个sql是不是在前面已经查询过了,是则直接返回结果,否则继续
5、解析器解析,解析语法、语义,生成语法树。词法分析:哪些是关键字,语法分析:sql组装的对不对
6、优化器,对我们写的sql进行优化,判断是否能够使用索引,使用哪一个等,分为逻辑查询优化和物理查询优化,逻辑查询优化:通过sql等价变换提升查询效率,物理查询优化:通过索引和表连接方式等技术来进行优化
7、存储引擎(默认innoDB)与底层的文件系统进行交互
8、到具体的文件系统进行查找
9、将数据以 key-value 形式缓存起来
10、SQL接口返回数据

如图

查询缓存已经在8.0版本移除,具体原因是命中率太低,只有相同的查询操作才会命中查询缓存,两个查询请求在任何字符上的不同(例如:空格、注释、大小写),都会导致缓存不会命中。其次,如果表数据经常更新,为了数据正确,缓存会经常被删除掉 。5.7版本可以通过设置 query_cache_type 来控制是否开启缓存,0:关闭,1:开启,2:按需使用

存储引擎

存储引擎就是指表的类型,在前面,我们讲到了不同存储引擎生成的文件是不同的,以前的存储引擎叫做表处理器,它的功能是接收上层传下来的指令,然后对表中的数据进行提取或写入操作。
查看存储引擎

show engines

执行命令后,展示相关存储引擎及其支持情况,介绍等,其中,能对事务提供支持的,只有 innodb,因此它也是默认的存储引擎。注意:每个存储引擎都具备不同的优缺点,没有绝对的优势,需要根据不同的场景选择不同的存储引擎。
下面我介绍几个常用的存储引擎:

InnoDB

具备外键支持功能的事务存储引擎

  • mysql从3.23.34a开始就包含InnoDB存储引擎,大于等于5.5之后,默认采用该引擎
  • 除了增加和查询外,还需要更新、删除操作,那么,应优先选择InnoDB
  • InnoDB在崩溃后能够自动恢复
  • InnoDB支持行级锁,能更好应对高并发场景
  • InnoDB是为处理巨大数据量的最大性能设计
    因此:除非有非常特别的原因需要使用其他的存储引擎外,都应该优先考虑InnoDB引擎

MyISAM

主要的非事务处理存储引擎

  • MyISAM提供了大量的特性,包括全文索引、压缩、空间函数等,但MyISAM不支持事务、行级锁、外键,在崩溃后无法安全恢复
  • 5.5版本前的默认存储引擎
  • 针对数据统计有额外的常数存储,因此 count(*) 的效率很高
  • 访问的速度快
    适用场景:对事务完整性没有要求或者以查询、新增为主的应用

InnoDB与MyISAM对比图

Archive

用于数据存档

  • archive是归档的意思,紧紧支持插入和查询两种功能(行被插入后不能再修改)
  • 在MySQL5.5后支持索引功能
  • 拥有很好的压缩机制,使用zlib压缩库,在记录请求的时候实时的进行压缩,经常被用来作为仓库使用
  • 创建ARCHIVE表时,存储引擎会创建名称以表名开头的文件,数据文件的扩展名为 .ARZ
  • 根据英文的测试结果来看,同样数据量下,Archive表比MyISAM表要小约 75%,比支持事务处理的InnoDB表小约 83%
  • Archive存储引擎采用了行级锁,支持 AUTO_INCREMENT 列属性。尝试在任何其他列上创建索引会导致错误
    适用场景:存储大量的独立的作为历史记录的数据(日志、档案等), 拥有很高的插入速度,但是对查询的支持较差

Blackhole

丢弃写操作,读操作会返回空内容

  • Blackhole引擎没有实现任何存储机制,它会丢弃所有插入的数据,不做任何保存
  • 服务器会记录Blackhole表的日志,所以可以用于复制数据到备库,或者简单地记录到日志,这种方式会碰到很多问题,因此并不推荐

CSV

存储数据时,以逗号分隔各个数据项

  • CSV 引擎可以将普通的CSV文件作为MySQL的表来处理,但不支持索引
  • CSV 引擎可以作为一种数据交换的机制,非常有用
  • CSV 存储的数据直接可以在操作系统里,用文本编辑器,或者excel读取
  • 对于数据的快速导入、导出是有明显优势的
  • 创建CSV 表时,服务器会创建一个纯文本数据文件,其名称以表名开头并带有 .CSV 扩展名,当有数据存入时,存储引擎将其以逗号分隔的格式保存到数据文件中

Memory

置于内存的表

  • Memory采用的逻辑介质是内存,响应速度很快,但当mysqld守护进程崩溃的时候数据会丢失,另外,要求存储数据的数据长度是不变的格式
  • Memory 同时支持哈希索引和B+树索引,hash能快速找到数据,但范围查找很慢,默认使用hash索引
  • Memory 表至少比MyISAM表要快一个数量级
  • MEMORY 表的大小是受到限制的,表的大小主要取决于两个参数,分别是 max_rows 和 max_heap_table_size
  • 数据文件与索引文件分开存储,每个表对应一个磁盘文件,该文件的文件名与表名相同,该文件只存储表的结构,数据文件则存在内存当中

适用场景:目标数据比较小,而且会频繁的访问

其他

Federated

访问远程表

  • Federated 引擎是访问其他MySQL服务器的一个代理,尽管该引擎看起来提供了一种很好的跨服务器的灵活性,但也称经常带来问题,因此默认是禁用的

Merge

管理多个MyISAM表构成的表集合

NDB

MySQL 集群专用存储引擎

  • 也叫作NDB Cluster 存储引擎,主要是用于 MySQL Cluster 分布式集群环境,类似于Oracle的 RAC 集群

引擎对比

MySQL中同一个数据库,不同的表可以选择不同的存储引擎,常用存储引擎对比如下

end…

如果总结的还行,就点个赞呗 @_@ 如有错误,欢迎指正!

mysql高级-2-执行流程及常见索引相关推荐

  1. MySQL(一)SQL执行流程与MySQL架构

    目录 MySQL语句的执行流程 1.通信协议 1.1通信协议 1.2 通信方式 2.查询缓存 3.语法解析和预处理 3.1 词法解析 3.2 语法解析 3.3 预处理器 4.查询优化(Query Op ...

  2. 一文搞懂select语句在MySQL中的执行流程!

    MySQL作为互联网行业使用最多的关系型数据库之一,与其免费.开源的特性是密不可分的.然而,很多小伙伴工作了很多年,只知道使用MySQL进行CRUD操作,这也导致很多小伙伴工作多年后,想跳槽进入大厂, ...

  3. MySQL高级篇(SQL优化、索引优化、锁机制、主从复制)

    目录 0 存储引擎介绍 1 SQL性能分析 2 常见通用的JOIN查询 SQL执行加载顺序 七种JOIN写法 3 索引介绍 3.1 索引是什么 3.2 索引优劣势 3.3 索引分类和建索引命令语句 3 ...

  4. MySQL——update 语句执行流程

    图1 update语句执行流程 从 Buffer Pool(内存中) 中查看是否有这条数据,没有就从磁盘中加载到缓冲池,然后对这行记录加独占锁: 把更新行记录的旧值写入 undo log(以便回滚): ...

  5. MySQL查询SQL执行流程

    一条查询 SQL 语句是如何执行的? 程序或者工具要操作数据库,第一步要做什么事情?跟数据库建立连接 通信协议 首先,MySQL 必须要运行一个服务,监听默认的 3306 端口 在我们开发系统跟第三方 ...

  6. 教你怎么玩indexedDB浏览器数据库,执行流程以及常见错误等等

    (小编最近在研究indexedDB数据库,在网上看的文档都有些不好理解,像小编这个接触过mySql,Oracle,SQL Server的人看了都是云里雾里的,所以决定自己写一篇关于indexedDB是 ...

  7. mysql启动时执行sql server_常见 mysql 启动、运行.sql 文件错误处理

    1.mysql 启动错误处理 查看 log: Mac: /usr/local/var/mysql/lizhendeMacBook-Pro.local.err 根据 log 针对性的进行调整,包治百病 ...

  8. 2.mysql底层架构和sql执行流程

    目录 1.学习目标 2.一条查询 SQL 语句是如何执行的? 2.1 通信协议 2.2 查询缓存 2.3. 语法解析和预处理(Parser & Preprocessor) 2.4 查询优化(Q ...

  9. 权限表使用联合主键吗_天天写 order by,你知道Mysql底层执行流程吗?

    前言 在实际的开发中一定会碰到根据某个字段进行排序后来显示结果的需求,但是你真的理解order by在 Mysql 底层是如何执行的吗? 假设你要查询城市是苏州的所有人名字,并且按照姓名进行排序返回前 ...

最新文章

  1. FZU 2297 Number theory【线段树/单点更新/思维】
  2. java 动态读取文件_Java窗体动态加载磁盘文件的实现方法
  3. python 生成html表的报告_pytest文档7-pytest-html生成html报告
  4. 带标签的循环语句、switch
  5. limux php启动_linux下nginx与php设置开机启动代码
  6. 演变模型_开放组织的演变
  7. EasyPR中文车牌识别系统开发
  8. TypeId和IidManager关系
  9. 86版五笔单字效率分析
  10. HDU - 3174(计算几何)
  11. 微信小程序-多层饼图/包含关系饼图/自定义饼图关系模式
  12. 多线程归并排序C语言,快速排序 和 归并排序  c语言实现
  13. Leetcode:Singel Number
  14. (原创)分布式系统应对单点故障策略选择
  15. 在 Linux 上以 All-in-One 模式安装 KubeSphere
  16. vw 前端_前端常用开发单位-vw
  17. Go语言map的并发操作
  18. 怎样用计算机计算分数除法,分数除法的计算方法
  19. 验证码及验证码透明的背景
  20. 2018年9月26日公司断网情况处理(交换机环路,err-disable state)

热门文章

  1. 如何调整PDF的页面大小为A4?
  2. 学习日记day03 coreldraw
  3. Python零基础速成班-第12讲-Python获取网络数据Socket,API接口,网络爬虫Crawler(制作弹幕词云)
  4. 网络文件系统---nfs
  5. 二次开发扩展能力,能帮助星图地球开发者平台实现什么?
  6. 2019 第十一周作业
  7. [小清新] 一段 node 脚本生成风格优雅的 Directory Tree
  8. 微信开发小程序面试题
  9. 盛迈坤电商:店铺简介写应该注意什么
  10. .htaccess基本设置