MySQL是怎样运行的:(1)重新认识MySQL
Session 1 重新认识MySQL
通过which mysql查看mysql的安装位置。我在wsl上的安装位置在/usr/bin/下。(不过正常来讲,应该是装在/usr/local/mysql下)

其中,mysqld是启动服务器程序的命令,mysql是启动客户端程序的命令(’d’应该表示守护进程)
输入 mysqld 命令并按下回车键后,终端即被占用且没有任何输出,这意味着 MySQL 服务器已经在后台启动,此时另开一个终端即可连接了。也可以加上&将服务进程挂到后台。
1 | mysqld & |
启动客户端:
1 | mysql -h主机名 -u用户名 -p密码 # 启动客户端 |
各个参数的意义如下:
| 参数名 | 含义 |
|---|---|
h |
表示服务器进程所在计算机的域名或者IP地址,如果服务器进程就运行在本机的话,可以省略这个参数,或者填localhost或者127.0.0.1。也可以写作 --host=主机名的形式。 |
u |
表示用户名。也可以写作 --user=用户名的形式。 |
p |
表示密码。也可以写作 --password=密码的形式。 |
如果服务器和客户端安装在同一台机器上,-h参数可以省略
如果省略-u参数,会把登陆操作系统的用户名当作MySQL的用户名
输入-p不带密码,则会另起一行输入密码(不显示)
客户端进程可以采用TCP/IP(不同主机)、命名管道或共享内存(Window)、Unix域套接字(Unix)这几种方式之一来与服务器进程建立连接。
MySQL服务器程序默认监听的Unix域套接字文件路径为/tmp/mysql.sock,客户端程序也默认连接到这个Unix域套接字文件。我们也可以改变这个默认路径:
1 | mysqld --socket=/tmp/a.txt # 服务端 |
不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果)
每当有一个客户端进程连接到服务器进程时,服务器进程都会创建一个线程来专门处理与这个客户端的交互,当该客户端退出时会与服务器断开连接,服务器并不会立即把与该客户端交互的线程销毁掉,而是把它缓存起来,在另一个新的客户端再进行连接时,把这个缓存的线程分配给该新客户端。这样就起到了不频繁创建和销毁线程的效果,从而节省开销。

查询缓存在MySQL 8.0中删除。
真正去访问表(只是个逻辑结构)是由存储引擎去完成的。为了管理方便,人们把连接管理、查询缓存、语法解析、查询优化这些并不涉及真实数据存储的功能划分为MySQL server的功能,把真实存取数据的功能划分为存储引擎的功能,并提供统一的调用接口(也就是存储引擎API)。在MySQL server完成了查询优化后,只需按照生成的执行计划调用底层存储引擎提供的API,获取到数据后返回给客户端就好了。
MySQL支持的储存引擎(可通过SHOW ENGINES;查看):
| 存储引擎 | 描述 |
|---|---|
ARCHIVE |
用于数据存档(行被插入后不能再修改) |
BLACKHOLE |
丢弃写操作,读操作会返回空内容 |
CSV |
在存储数据时,以逗号分隔各个数据项 |
FEDERATED |
用来访问远程表 |
InnoDB |
具备外键支持功能的事务存储引擎 |
MEMORY |
置于内存的表 |
MERGE |
用来管理多个MyISAM表构成的表集合 |
MyISAM |
主要的非事务处理存储引擎 |
NDB |
MySQL集群专用存储引擎 |
最常用的就是InnoDB(默认)和MyISAM,有时会提一下Memory。InnoDB是唯一(至8.0)支持事务处理的引擎。
1 | # 允许修改表的储存引擎 |