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 | # 允许修改表的储存引擎 |