MySQL的B+树索引
B+树索引页和记录的关系示意图如下:
页a、页b、页c … 页n 这些页可以不在物理结构上相连,只要通过双向链表相关联即可。
没有索引的查找先只唠叨搜索条件为对某个列精确匹配的情况,所谓精确匹配,就是搜索条件中用等于 = 连接起的表达式,比如这样:
SELECT [列名列表] FROM 表名 WHERE 列名 = xxx;
在一个页中的查找假设目前表中的记录比较少,所有的记录都可以被存放到一个页中,在查找记录的时候可以根据搜索条件的不同分为两种情况:
以主键为搜索条件
这个查找过程我们已经很熟悉了,可以在 页目录 中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。
以其他列作为搜索条件
因为在数据页中并没有对非主键列建立所谓的 页目录,所以我们无法通过二分法快速定位相应的 槽 。这种情况下只能从 最小记录 开始依次遍历单链表中的每条记录,然后对比每条记录是不是符合搜索条件。很显然,这种查找的效率是非常低的。
在很多页中查找大部分情况下我们表中存放的记录都是非常多的,需要好多的数据页来存储这些记录。在很多页中查找记录的话可 ...
MySQL的数据目录
MySQL的数据目录数据库和文件系统的关系像 InnoDB 、 MyISAM 这样的存储引擎都是把表存储在文件系统上的。当我们想读取数据的时候,这些存储引擎会从文件系统中把数据读出来返回给我们,当我们想写入数据的时候,这些存储引擎会把这些数据又写回文件系统。
本章就是要唠叨一下 InnoDB 和 MyISAM 这两个存储引擎的数据如何在文件系统中存储的。
MySQL数据目录MySQL服务器程序在启动时会到文件系统的某个目录下加载一些文件,之后在运行过程中产生的数据也都会存储到这个目录下的某些文件中,这个目录就称为 数据目录
数据目录和安装目录的区别我们之前只接触过 MySQL 的安装目录(在安装 MySQL 的时候我们可以自己指定),我们重点强调过这个 安装目录 下非常重要的 bin 目录,它里边存储了许多关于控制客户端程序和服务器程序的命令(许多可执行文件,比如 mysql , mysqld , mysqld_safe 等等等等好几十个)。
数据目录 是用来存储 MySQL 在运行过程中产生的数据,一定要和本章要讨论的 安装目录 区别开
如何确定MySQL中的数据目录到底 MySQ ...
MySQL中InnoDB数据页结构
InnoDB数据页结构数据页:存放我们表中记录的页,官方称这种存放记录的页为索引( INDEX )页,这些表中的记录就是我们日常口中所称的数据,所以也可以称这种存放记录的页为数据页
数据页结构的快速浏览数据页代表的这块 16KB 大小的存储空间可以被划分为多个部分,不同部分有不同的功能,各个部分如图所示:
一个 InnoDB 数据页的存储空间大致被划分成了 7 个部分,有的部分占用的字节数是确定的,有的部分占用的字节数是不确定的。
名称
中文名
占用空间大小
简单描述
File Header
文件头部
38 字节
页的一些通用信息
Page Header
页面头部
56 字节
数据页专有的一些信息
Infimum + Supremum
最小记录和最大记录
26 字节
两个虚拟的行记录
User Records
用户记录
不确定
实际存储的行记录内容
Free Space
空闲空间
不确定
页中尚未使用的空间
Page Directory
页面目录
不确定
页中的某些记录的相对位置
File Trailer
文件尾部
8 字节
校验页是否完整
...
MySqlB+树索引的使用
B+树索引的使用我们必须熟悉下边这些结论:
每个索引都对应一棵 B+ 树, B+ 树分为好多层,最下边一层是叶子节点,其余的是内节点。所有 用户记录都存储在 B+ 树的叶子节点,所有 目录项记录 都存储在内节点。
InnoDB 存储引擎会自动为主键(如果没有它会自动帮我们添加)建立 聚簇索引 ,聚簇索引的叶子节点包含完整的用户记录。
我们可以为自己感兴趣的列建立 二级索引 , 二级索引 的叶子节点包含的用户记录由 索引列 + 主键 组成,所以如果想通过 二级索引 来查找完整的用户记录的话,需要通过 回表 操作,也就是在通过 二级索引找到主键值之后再到 聚簇索引 中查找完整的用户记录。
B+ 树中每层节点都是按照索引列值从小到大的顺序排序而组成了双向链表,而且每个页内的记录(不论是用户记录还是目录项记录)都是按照索引列的值从小到大的顺序而形成了一个单链表。如果是 联合索引 的话,则页面和记录先按照 联合索引 前边的列排序,如果该列值相同,再按照 联合索引 后边的列排序。
通过索引查找记录是从 B+ 树的根节点开始,一层一层向下搜索。由于每个页面都按照索引列的值建立了Page Direc ...
DDD(上)
DDDDDD 既不是 MVC 一样的工程结构,也不能直接等同于微服务架构,更不是一种设计模式。
DDD 是领域驱动设计(Domain-Driven Design)的缩写,这是一种主要软件开发方法,由 Eric Evans 在他的书《领域驱动设计:软件核心复杂性应对之道》(Domain-Driven Design: Tackling Complexity in the Heart of Software)中首次提出。
DDD 主要关注于创建与业务领域紧密相关的软件模型,以确保软件能够准确地解决实际问题。
不同的软件,可以有不同的软件模型,使用DDD创建出最适合的软件模型
核心理念领域模型(Domain Model):领域模型是对特定业务领域知识的精确表述,它包括业务中的实体(Entities)、值对象(Value Objects)、服务(Services)、聚合(Aggregates)、聚合根(Aggregate Roots)等概念。领域模型是DDD的核心,它反映了业务专家的语言和决策。
统一语言(Ubiquitous Language):统一语言是开发团队与业务专家共同使用的语言, ...
MySQL中InnoDB记录结构
InnoDB记录结构MySQL 服务器上负责对表中数据的读取和写入工作的部分是 存储引擎 ,而服务器又支持不同类型的存储引擎。真实数据在不同存储引擎中存放的格式一般是不同的,甚至有的存储引擎比如 Memory 都不用磁盘来存储数据,也就是说关闭服务器后表中的数据就消失了。
InnoDB页简介InnoDB 是一个将表中的数据存储到磁盘上的存储引擎,所以即使关机后重启我们的数据还是存在的。
真正处理数据的过程是发生在内存中的,所以需要把磁盘中的数据加载到内存中。
InnoDB 采取的方式是:将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为 16 KB。也就是在一般情况下,一次最少从磁盘中读取16KB的内容到内存中,一次最少把内存中的16KB内容刷新到磁盘中。
InnoDB行格式我们平时是以记录为单位来向表中插入数据的,这些记录在磁盘上的存放方式也被称为 行格式 或者 记录格式 。
设计 InnoDB 存储引擎的大叔们到现在为止设计了4种不同类型的 行格式 ,分别是 Compact 、 Redundant 、Dynamic 和 Compressed 行 ...
MySQL中的字符集和比较规则
字符集和比较规则简介字符集简介在计算机中只能存储二进制数据,那该怎么存储字符串呢?当然是建立字符与二进制数据的映射关系了,建立这个关系最起码要搞清楚两件事儿
你要把哪些字符映射成二进制数据?也就是界定清楚字符范围。
怎么映射?将一个字符映射成一个二进制数据的过程也叫做 编码 ,将一个二进制数据映射到一个字符的过程叫做 解码 。
人们抽象出一个 字符集 的概念来描述某个字符范围的编码规则。
一些重要的字符集
ASCII 字符集: 共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。由于总共才128个字符,所以可以使用1个字节来进行编码
ISO 8859-1 字符集: 共收录256个字符,是在 ASCII 字符集的基础上又扩充了128个西欧常用字符(包括德法两国的字母),也可以使用1个字节来进行编码。这个字符集也有一个别名 latin1 。
GB2312 字符集: 收录了汉字以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母。其中收录汉字6763个其他文字符号682个。同时这种字符集又兼容 ASCII 字符集,所以在编码方式上显得有些奇怪:
如果 ...
MySQL的启动选项和系统变量
启动命令mysql --help 可以看到 mysql 程序支持的启动选项。
mysqld_safe --help可以看到 mysqld_safe 程序支持的启动选项。
查看 mysqld 支持的启动选项有些特别,需要使用 mysqld --verbose --help。
命令行选项的长形式和短形式使用长形式选项时在选项名前加两个短划线 –
使用短形式选项时在选项名前只加一个短划线 -
选项名是区分大小写的,比如 -p 和 -P 选项拥有完全不同的含义
配置文件MySQL 程序在启动时会寻找多个路径下的配置文件,这些路径有的是固定的,有的是可以在命令行指定的
Windows 操作系统中, MySQL 会按照下列路径来寻找配置文件
路径名
备注
%WINDIR%\my.ini , %WINDIR%\my.cnf
C:\my.ini , C:\my.cnf
BASEDIR\my.ini , BASEDIR\my.cnf
defaults-extra-file
命令行指定的额外配置文件路径
%APPDATA%\MySQL.mylogin.cnf
登录路径 ...
MySQL的客户端与服务端
MySQL的客户端/服务器架构MySQL 服务器程序和客户端程序本质上都算是计算机上的一个进程,这个代表着 MySQL服务器程序的进程也被称为 MySQL数据库实例,简称数据库实例。
MySQL 服务器进程的默认名称为 mysqld
MySQL 客户端进程的默认名称为 mysql
启动MySQL服务器的程序mysqld: 直接启动一个服务器进程
mysqld_safe: 间接的调用 mysqld,启动了另外一个监控进程(服务器进程挂了的时候,可以帮助重启它),使用 mysqld_safe 启动服务器程序时,它会将服务器程序的出错信息和其他诊断信息重定向到某个文件中,产生出错日志
mysql.server:间接的调用 mysqld_safe,在调用 mysql.server 时在后边指定 start 参数就可以启动服务器程序
这个 mysql.server 文件其实是一个链接文件,它的实际文件是 ../support-files/mysql.server
mysql.server stop:关闭正在运行的服务器程序
mysqld_multi:对每一个服务器进程的启动或停止 ...
图解TCP/IP阅读笔记
网络基础知识计算机网络出现的背景计算机最初运行模式-独立模式
随着计算机发展,逐渐演变为连接多太计算机以实现信息共享
计算机网络根据网络的规模大小,可以分为 LAN(局域网) 和 WAN(广域网)
LAN:
WAN:
最初的计算机网络是由几台计算机相连在一起形成的私有网络,随着这种私有网络的不断发展,越来越多的私有网络尝试互相连接来组成更大的私有网络,最终形成了不局限于公司或者部门内部,而是可以与互联网中任意一台计算机进行通信的网络。
计算机与网络发展的7个阶段最初的计算机使用的系统是 批处理系统
批处理:事先将用户程序和数据装入卡带和磁盘,并由计算机按照一定的顺序读取,从而使用户所要执行的这些程序和数据能够一并批量得到处理的方式
继批处理系统之后,出现的是分时系统
分时系统:多个终端与一个计算机相连,允许多个用户同时使用一台计算机的系统,以达到“一人一机”的目的
分时系统的重要特征:多路线、独占性、交互性、及时性
分时系统的出现促进了像BASIC这样能够与计算机实现交互的编程语言的发展
在分时系统中,计算机与每个终端之间用通信线路连接,这并不意味着计算机与计算机之间也已 ...