MySQL的架构
这个理解其实很简单,就是简单的客户端-服务端架构,客户端发起请求,服务端操作数据。从图中我们可以看出,服务器程序处理来自客户端的查询请求大致需要经过三个部分,分别是连接管理、解析与优化、存储引擎。
[外链图片转存失败(img-e0hj6NfT-1562667794946)(evernotecid://D6CA8B83-7C76-4893-B45E-CF81AF565AB8/appyinxiangcom/14815409/ENNote/p8?hash=e0532f7400396da2dbe5ef6fead1ec31)]
启动MySQl服务器端
mysqld
MySQL的服务器进程被称为 MySQL数据库实例。正如每一个进程都有PID做唯一标识,MySql的服务器进程默认名称是mysqld。所以在安装路径下的 mysqld这个可执行文件就是MYSQL服务器程序,运行这个可执行文件就可以直接启动一个服务器进程.
mysqld_safe
顾名思义,安全启动mysqld,即启动的同时还启动了一个监控进程,这个监控进程在服务器进程挂了的时候重启它。并且会有error log
mysql.server
语句是 mysql.server start 间接调用 mysqld_safe 同理 mysql.server stop 用来关闭服务器程序
启动MySQL客户端
mySQL的客户端五花八门,workbench,mysqladmin,mysqldump,甚至idea也有插件可以直接用,但是其实最终需要的就是下面这句
mysql -h主机名 -u用户名 -p密码
注意:只有-p和密码中间不能有空白字符,其他的参数名之间可以有空白字符,但是-p之后可以回车,再下一行隐式的输入密码。
断开客户端和服务端的连接
断开客户端和服务器的连接并且关闭客户端,以下3个指令
quit
exit
\q
客户端和服务器连接
简单来说其实就是进程间的通信
tcp\ip
mysql的服务器默认端口 3306
可以通过mysqld -P端口
来重新指定端口号 注意 大写的P 小写p是密码
命名管道和共享内存
windows用户可以在启动服务器程序和客户端程序时添加参数来启用这种通信方式
- 命名管道
服务端:--enable-named-pipe
客户端:--pipe
或者--protocol=pipe
- 共享内存
服务端:--shares-memory
Unix域套接字文件
服务器进程和客户端进程都运行在同一台操作系统是Unix的机器上,就可以用Unix套接字文件来通信。怎么操作呢。启动客户端的时候指定主机名为localhost,或者启动参数 --protocol=socket
.服务端默认监听的文件路径/tmp/mysql.sock
客户端也默认连接到这个Unix域套接字文件。
改变默认的Unix域套接字文件需要服务端启动时指定参数mysqld --socket=/tmp/a.txt
并且客户端连接的时候--socket=/tmp/a.txt
显式指定。
服务器处理客户端请求
可以分为三部分连接管理、解析优化、存储引擎
连接管理
上面已经说了三种连接方式,每一个客户端进程连接到服务器进程时,服务器会创建一个线程。这里有点像线程池。每一个连接过来,就从线程池中拿一个线程出来,用完了也就是客户端断开连接的时候,缓存这个线程而不是销毁,等到新的客户端的时候在分配。
连接是长连接
服务器接收到的请求只是一个文本消息,返回的结果同样也只是一个文本消息
可以用SSL进行网络连接
解析优化
服务器接收到文本之后会,需要对文本进行处理。
-
查询缓存:MySQL服务器会把刚刚处理过的查询请求和结果缓存起了,下次有一模一样的请求过来的时候,直接存缓存找结果,这个缓存是可以在不同的客户端之间共享。如果两个查询请求有任何字符的不同 包括 空格、注释、大小写或者请求里面有系统函数、自定义变量、系统表这种,都不会命中缓存,当然如果表有任何变更了的时候,查询缓存都会失效
MySQL8.0已经删除了查询缓存,毕竟维护缓存是需要开销的
-
优化解析:简单来说就是一个编译的过程
-
查询优化:MySQL的优化程序会对我们的语句进行一些优化,结果就是生成一个执行计划。比如用
EXPLAIN
这个语句来查看某个语句的执行计划。
存储引擎
也就是真是存取数据的功能,接受上层传下来的指令,然后对表中的数据进行提取或写入操作。
常用的存储引擎InnoDB和MyISAM
InnoDB 具备外键支持功能的事务存储引擎—默认的存储引擎
MyISAM 主要的非事务处理存储引擎
可以为不同的表设置不同的存储引擎,建表的时候指定
CREATE TABLE 表名(
建表语句;
) ENGINE = 存储引擎名称;
或者这样修改
ALTER TABLE 表名 ENGINE = 存储引擎名称;