从根儿上理解 MySQL
那些看起来非常高深复杂的问题其实都是为了一个非常简单的初衷而不得不采用的设计。(hahahah)
覆盖的内容
初识MySQL
MySQL的客户端/服务器架构
MySQL的服务器程序直接和我们存储的数据打交道,然后可以有好多客户端程序连接到这个服务器程序,发送增删改查的请求,然后服务器就响应这些请求,从而操作它维护的数据。
我们日常使用MySQL的情景一般是这样的:
- 启动MySQL服务器程序;
- 启动MySQL客户端程序并连接到服务器程序;
- 在客户端程序中输入一些命令语句作为请求发送到服务器程序,服务器程序收到这些请求后,会根据请求的内容来操作具体的数据并向客户端返回操作结果。
MySQL服务器进程的默认名称为mysqld,MySQL客户端进程的默认名称为mysql。
MySQL的安装
macOS操作系统上的安装目录:
/usr/local/mysql/
命令行环境:类UNIX系统中的Shell或者Windows系统中的cmd.exe。
用户态:用户执行状态简称用户态。
系统态:系统执行状态简称系统态或核心态。
进程的用户程序段在执行时,该进程处于用户态。而一个进程的系统程序段在执行时,该进程处于系统态。
为什么要划分用户态和系统态?
一个最主要原因是要把用户程序和系统程序区分开,以利于程序的共享和保护。显然,这也是以增加系统复杂度和系统开销为代价的。
link:Linux探秘之用户态与内核态
自问自答环节:为什么要有用户态和内核态?-> 为了隔离开用户程序和系统程序 -> 引入linux的体系结构(内核控制计算机的硬件资源:cpu资源、存储资源和IO资源等;系统调用提供给上层应用访问的接口) -> 再引出用户态和内核态的切换 -> 最后说明切换的代价(上下文的保存和恢复)
启动MySQL服务器程序
在类Unix系统中启动MySQL服务器程序的可执行文件有很多,存在bin目录下:
- mysqld 代表着MySQL服务器程序(不常用);
- mysqld_safe 间接的调用mysqld,顺便启动一个监控进程,用于服务器挂了自动重启;
- mysql.server 间接的调用mysqld_safe,使用时指定start参数即可启动服务器程序;
- mysqld_multi 对每一个服务器进程的启动或停止进行监控。
启动MySQL客户端程序
我们成功启动MySQL服务器程序后,就可以接着启动客户端程序来连接到这个服务器。
mysql -h主机名 -u用户名 -p密码
客户端与服务器连接的过程
运行着的服务器程序和客户端程序本质上都是计算机上的一个进程,所以客户端进程向服务器进程发送请求并得到回复的过程本质上是一个进程间通信的过程!MySQL支持三种客户端和服务器进程的通信方式。
- TCP/IP
Explain详解(上)
Explain语句帮助我们查看某个查询语句的具体执行计划。输出的各个列作用如下:
好戏开场啦,构造数据库表:
CREATE TABLE single_table (
id INT NOT NULL AUTO_INCREMENT,
key1 VARCHAR(100),
key2 INT,
key3 VARCHAR(100),
key_part1 VARCHAR(100),
key_part2 VARCHAR(100),
key_part3 VARCHAR(100),
common_field VARCHAR(100),
PRIMARY KEY (id),
KEY idx_key1 (key1),
UNIQUE KEY idx_key2 (key2),
KEY idx_key3 (key3),
KEY idx_key_part(key_part1, key_part2, key_part3)
) Engine=InnoDB CHARSET=utf8;
假设有两个和signle_table表结构一模一样的s1和s2表,开始表演。