“三高”MySQL实战
砂糖桑
Sep 12, 2022
Last edited: 2022-9-12
type
Post
status
Published
date
Sep 12, 2022
slug
Tree-High-MySQL
summary
学习中
tags
MySQL
category
数据库
icon
password
Property
Sep 12, 2022 12:22 PM
“三高”指高并发、高性能、高可用。
SQL语句的执行 一图了解总结Mysql软件架构分层架构管道-过滤器架构微核架构TCP/IP连接MysqlMysql存储引擎MyISAMInnoDBMemoryArchive总结如何建表更符合业务索引组织表B+树索引即数据聚簇索引
SQL语句的执行
一图了解

- 连接器监听客户端的请求(一般是TCP),然后将指令和sql语句转发给缓存。
- 缓存会将之前执行过的语句以键值对的形式存储在内存中。键就是sql语句,值就是sql语句的结果。它可以提高一个sql语句第二次及以后执行的效率。

缓存的缺点是数据表修改后,就会删除所有相关缓存,不然会出现错误的结果。而这里的相关是”数据表相关“,范围很宽,所以这个缓存会经常失效。所以不推荐使用。
Mysql 8.0后已去掉缓存的功能。
- 分析器的作用是“分析做什么”。包括”词法分析“和”句法分析“。
- 词法分析:识别sql语句中的关键字。如select、update等。
- 句法分析:判断sql语句是否符合语法。
- 优化器的作用是“决定怎么做”。主要工作是决定如何使用索引——所以数据库中索引的正确使用至关重要。
- 执行器的作用是校验用户权限,然后调用存储引擎。
执行器会以行为粒度,调用存储引擎来执行sql语句。在没有索引的情况下,执行器会循环查询所有行,效率比较。
- 存储引擎(以最主流的InnoDB为例)的作用是将执行器的指令落实在数据文件上。不同存储引擎的原理和执行方法有很大不同。
文件中的数据存储格式和存储引擎相关,和执行器没有关系。
总结
- sql语句的执行过程涉及到了Mysql集合所有的模块。
- 一个sql语句是按照 ”分析-优化-执行-落实“ 的步骤执行的。
Mysql软件架构
实际上,中间这部分就是MySQL Server,它是mysql的主体。

我们可以从软件工程的角度,来分析mysql使用的经典软件架构。
分层架构

MySQL Server可以分为三层:连接层、sql层和引擎层。各层分别执行不同的功能。
管道-过滤器架构

”分析-优化-执行“ 这三步依次执行,可以看成管道-过滤器架构。
微核架构

将前两层看层MySQL Server的主体,存储引擎看成MySQL的插件。那么存储引擎就相当于MySQL Server功能的拓展,可以看成微核架构。
大型的软件往往不是单一的架构设计,而是多种混合。可以从宏观和微观的角度来分别研究。如Mysql宏观上是典型的分层架构,而微观上则有管道-过滤器架构和微核架构。
TCP/IP连接Mysql
现在研究从客户端到连接器的连接。
TCP/IP连接(即网络连接)是Mysql在任何平台都支持的连接方法。此外还有命名管道、共享内存、UNIX域套接字三种连接方式。我们只研究最主流和通用的TCP/IP连接。
TCP/IP连接Mysql的过程为:
- 三次握手建立Mysql连接。
- Mysql的认证连接(用户名、密码)。
- 客户端与服务端之间通过sql语句进行交互。
- 断开Mysql连接。
- 四次握手断开TCP连接。
在WireShark里面进行验证:
- 三次握手:C-S;S-C;C-S。

- Mysql认证连接:

- 断开Mysql连接:

- 四次握手:C-S;S-C;S-C;C-S。

3306是Mysql默认的端口;9977是我所使用的客户端的端口。
Mysql存储引擎
Mysql有四种常见的存储引擎:InnoDB、MyISAM、Memory、Archive。
MyISAM
Mysql5.5.5 之前默认的存储引擎。它插入数据快,空间利用率高。代价是不支持事务,这也是Mysql之前不太吃香的原因。
InnoDB
Mysql5.5.5 之后默认的存储引擎。支持事务、外键、崩溃修复与并发控制,功能比较强大。
Memory
Memory的所有数据都存储在内存中,速度快,问题是数据安全性差。通常的作用是建立一些临时表。
Archive
Archive对数据进行了压缩,所以空间利用率高,写入速度也不错。但是查询性能非常差,且不支持索引。
总结
- InnoDB是目前最主流的存储引擎,适合各种互联网业务。
- 查询效率要求非常高可以考虑使用MyISAM。
- 日志信息归档(不用来查询)可以考虑Archive。
- 临时表(不要求持久化)可以考虑Memory。
如何建表更符合业务
通过研究Mysql表的物理结构,为我们设计表、建表和维护表提供启发。
索引组织表
索引组织表就是由索引组织起来的表。
索引是数据库中对某一列或多个列的值进行预排序的数据结构。可以将它理解为数据的目录。
在InnoDB中,主键是一个特殊的索引字段,表都是根据主键顺序组织起来的。InnoDB数据表都是索引组织表。(InnoDB数据表由主键组织起来;主键是特殊的索引→InnoDB是索引组织表)
InnoDB存储引擎中,每个表都要有一个主键。如果没有显示声明主键,那么会去找建表语句中第一个非空唯一字段(Unique NOT Null)作为索引;如果没有非空唯一字段,那么InnoDB会自动常见一个6字节的指针作为主键,这个指针是查询不到的。CREATE TABLE Z( a INT NOT NULL, b INT NULL, c INT NOT NULL, d INT NOT NULL, UNIQUE KEY(b), UNIQUE KEY(d), UNIQUE KEY(c) )
d字段是第一个非空唯一索引,所以它是主键:

B+树
查找算法最典型的算法就是二分查找。二分查找的前提是所有数据必须有序,而要维护数据的有序性代价太大,因此有了二叉查找树的数据结构。二叉查找树比较容易维护,但是查找的性能和树的高度相关。为了降低高度,提出了平衡二叉树。
平衡二叉树的时间复杂度已经不错了,但是由于AVL树一个结点只有一个数据,所以需要读取很多次数据。而磁盘读取是比较耗时的,一个结点存储多个数据可以减少磁盘读取的次数,这就是B Tree。

B+树在B树的基础上改进了数据结构,使范围查询效率更高。

B树与B+树具体的数据结构可以查看这篇不正经的文章:
B+树是目前最主流的数据库索引数据结构。它由线性表、二叉树、B树发展而来,继承了线性表(范围查询)和B树(磁盘利用率)的优势。
索引即数据
InnoDB使用B+树作为索引的数据结构。B+树每一个结点可以有上万条数据,高度一般为2-4层,总共可以存很多条数据。InnoDB的索引分为聚簇索引和辅助索引。
聚簇索引
聚簇索引即主索引。聚簇的意思就是将索引和数据集合在一起。
- Catalog
- About
0%