Session 1 重新认识MySQL

通过which mysql查看mysql的安装位置。我在wsl上的安装位置在/usr/bin/下。(不过正常来讲,应该是装在/usr/local/mysql下)

image-20230626140346788

其中,mysqld是启动服务器程序的命令,mysql是启动客户端程序的命令(’d’应该表示守护进程)

输入 mysqld 命令并按下回车键后,终端即被占用且没有任何输出,这意味着 MySQL 服务器已经在后台启动,此时另开一个终端即可连接了。也可以加上&将服务进程挂到后台。

1
mysqld &

启动客户端:

1
2
3
mysql -h主机名  -u用户名 -p密码 # 启动客户端
mysql -hlocalhost -u root -p123456 # 例(-p后没有空格,其他选项随意)
mysql -h127.0.0.1 -uroot -P3307 -p # 例(-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
2
mysqld --socket=/tmp/a.txt # 服务端
mysql -hlocalhost -uroot --socket=/tmp/a.txt -p # 客户端

不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果)

每当有一个客户端进程连接到服务器进程时,服务器进程都会创建一个线程来专门处理与这个客户端的交互,当该客户端退出时会与服务器断开连接,服务器并不会立即把与该客户端交互的线程销毁掉,而是把它缓存起来,在另一个新的客户端再进行连接时,把这个缓存的线程分配给该新客户端。这样就起到了不频繁创建和销毁线程的效果,从而节省开销

image-20230626150335912

查询缓存在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,有时会提一下MemoryInnoDB是唯一(至8.0)支持事务处理的引擎。

1
2
3
4
# 允许修改表的储存引擎
ALTER TABLE 表名 ENGINE = 存储引擎名称;
# 查看表结构(引擎已改变)
SHOW CREATE TABLE 表名;