网站首页 > 编程文章 正文
前言
上一篇文章初识MySQL(上):这是你了解的MySQL吗? ,我们一起学习了MySQL的安装及相关概念知识,初步了解了MySQL是什么。那么,在使用MySQL的过程中,必不可少的必然是启动客户端和服务端了,那么仅仅简单的会启动就可以了吗?当然不够,要想了解的更多,不仅要会用,还要知道客户端和服务端在我们使用MySQL的过程中都做了什么。今天就来一起学习下吧~
启动MySQL客户端程序
在上篇文章中我们成功启动MySQL服务器程序后,就可以接着启动客户端程序来连接到这个服务器喽,bin目录下有许多客户端程序,比方说mysqladmin、mysqldump、mysqlcheck等等等等(好多呢,就不一一列举了)。这里我们重点要关注的是可执行文件mysql,通过这个可执行文件可以让我们和服务器程序进程交互,也就是发送请求,接收服务器的处理结果。启动这个可执行文件时一般需要一些参数,格式如下:
mysql -h主机名 -u用户名 -p密码
-h:表示服务器进程所在计算机的域名或者IP地址,如果服务器进程就运行在本机的话,可以省略这个参数,或者填localhost或者127.0.0.1。也可以写作 --host=主机名的形式。
-u:表示用户名。也可以写作 --user=用户名的形式。
-p:表示密码。也可以写作 --password=密码的形式。
mysql -hlocalhost -uroot -p123456
连接注意事项
最好不要在一行命令中输入密码。
这是一个安全性问题,我们直接在黑框框里输入密码很可能被别人看到,这和你当着别人的面输入银行卡密码没啥区别,所以我们在执行mysql连接服务器的时候可以不显式的写出密码,就像这样:
mysql -hlocalhost -uroot -p
点击回车之后才会提示你输入密码:
Enter password:
不过这回你输入的密码不会被显示出来,心怀不轨的人也就看不到了,输入完成点击回车就成功连接到了服务器。
如果你非要在一行命令中显式的把密码输出来,
那-p和密码值之间不能有空白字符(其他参数名之间可以有空白字符):
mysql -h localhost -u root -p123456
如果加上了空白字符就是错误的,比如这样:
mysql -h localhost -u root -p 123456
mysql的各个参数的摆放顺序没有硬性规定,也就是说你也可以这么写:
mysql -p -u root -h localhost
有时候-h参数可以省略,如果你的服务器和客户端安装在同一台机器上:
mysql -u root -p
如果你使用的是类UNIX系统,并且省略-u参数后,会把你登陆操作系统的用户名当作MySQL的用户名去处理。比方说我用登录操作系统的用户名是xiaozhu,那么在我的机器上下边这两条命令是等价的:
mysql -u xiaozhu -pmysql -p
对于Windows系统来说,默认的用户名是ODBC,你可以通过设置环境变量USER来添加一个默认用户名。
客户端与服务器连接的过程
我们现在已经知道如何启动MySQL的服务器程序,以及如何启动客户端程序来连接到这个服务器程序。而这些服务器程序和客户端程序本质上都是计算机上的一个进程,所以客户端进程向服务器进程发送请求并得到回复的过程本质上是一个进程间通信的过程!MySQL支持下边三种客户端进程和服务器进程的通信方式。
- TCP/IP
在我们实际使用过程中,数据库服务器进程和客户端进程可能运行在不同的主机中,那么它们之间就只能通过网络来进行通讯。MySQL采用TCP作为服务器和客户端之间的网络通信协议。在网络环境下,每台计算机都有一个唯一的IP地址,如果某个进程有需要采用TCP协议进行网络通信方面的需求,可以向操作系统申请一个端口号,这是一个整数值,它的取值范围是0~65535。这样在网络中的其他进程就可以通过IP地址 + 端口号的方式来与这个进程连接,这样进程之间就可以通过网络进行通信了。
MySQL服务器启动的时候会默认申请3306端口号,之后就在这个端口号上等待客户端进程进行连接,用书面一点的话来说,MySQL服务器会默认监听3306端口。
如果3306端口号已经被别的进程占用了或者我们单纯的想自定义该数据库实例监听的端口号,那我们可以在启动服务器程序的命令行里添加-P参数来明确指定一下端口号,比如这样:
mysqld -P3307
如果客户端进程想要使用TCP/IP网络来连接到服务器进程,比如我们在使用mysql来启动客户端程序时,在-h参数后必须跟随IP地址来作为需要连接的服务器进程所在主机的主机名:
mysql -h127.0.0.1 -uroot -P3307 -p
命名管道和共享内存
如果是Windows用户,客户端进程和服务器进程之间可以考虑使用命名管道或共享内存进行通信:
- 使用命名管道来进行进程间通信
需要在启动服务器程序的命令中加上--enable-named-pipe参数,然后在启动客户端程序的命令中加入--pipe或者--protocol=pipe参数。
- 使用共享内存来进行进程间通信
需要在启动服务器程序的命令中加上--shared-memory参数,在成功启动服务器后,共享内存便成为本地客户端程序的默认连接方式,不过我们也可以在启动客户端程序的命令中加入--protocol=memory参数来显式的指定使用共享内存进行通信。
Unix域套接字文件
如果我们的服务器进程和客户端进程都运行在同一台操作系统为类Unix的机器上的话,我们可以使用Unix域套接字文件来进行进程间通信。如果我们在启动客户端程序的时候指定的主机名为localhost,或者指定了--protocol=socket的启动参数,那服务器程序和客户端程序之间就可以通过Unix域套接字文件来进行通信了。MySQL服务器程序默认监听的Unix域套接字文件路径为/tmp/mysql.sock,客户端程序也默认连接到这个Unix域套接字文件。如果我们想改变这个默认路径,可以在启动服务器程序时指定socket参数,就像这样:
mysqld --socket=/tmp/a.txt
服务器处理客户端请求
其实不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果)。
- 连接器
连接器负责跟客户端建立连接、获取权限、维持和管理连接。客户端与数据库交互最先就是要从连接池中获取到连接,才能继续后续的操作。
mysql -h$ip -P$port -u$user -p
与数据库建立连接,完成经典的TCP握手后,会校验身份(用户名、密码),校验通过后获得数据库连接。这也说明一个问题:一个用户成功建立连接后,即使你用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限。修改完成后,只有再新建的连接才会使用新的权限设置。
建立连接后,如果没有后续操作,那么连接空闲,在一段时间后,数据库会自动断开连接(默认8小时)。
- 查询缓存
MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端。
如果在缓存中查不到,就会继续后续的操作。这里可能大部分人会觉得 那缓存命中率高了,数据库性能就好了,不是很好吗?其实,这里不建议大家查询缓存,虽然缓存效率高,但是弊端却很大,最主要的就是:缓存更新不及时,查询的结果为旧数据,影响实际业务。
我们可以将参数 query_cache_type 设置成 DEMAND,这样对于默认的 SQL 语句都不使用查询缓存。而对于你确定要使用查询缓存的语句,可以用 SQL_CACHE 显式指定,像下面这个语句一样:
mysql> select SQL_CACHE * from T where ID=10;
但是,MySQL8.0之后就没有这个功能了。
- 语法解析
如果查询缓存没有命中,接下来就需要进入正式的查询阶段了。因为客户端程序发送过来的请求只是一段文本而已,所以MySQL服务器程序首先要对这段文本做分析,判断请求的语法是否正确,然后从文本中将要查询的表、各种查询条件都提取出来放到MySQL服务器内部使用的一些数据结构上来。
- 查询优化
语法解析之后,服务器程序获得到了需要的信息,比如要查询的列是哪些,表是哪个,搜索条件是什么等等,但光有这些是不够的,因为我们写的MySQL语句执行起来效率可能并不是很高,MySQL的优化程序会对我们的语句做一些优化,如外连接转换为内连接、表达式简化、子查询转为连接吧啦吧啦的一堆东西。优化的结果就是生成一个执行计划,这个执行计划表明了应该使用哪些索引进行查询,表之间的连接顺序是啥样的。我们可以使用EXPLAIN语句来查看某个语句的执行计划,关于查询优化这部分的详细内容我们后边会仔细唠叨,现在你只需要知道在MySQL服务器程序处理请求的过程中有这么一个步骤就好了。
- 存储引擎
负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。可以在create table 语句中使用 engine=memory, 来指定使用内存引擎创建表。
总结
今天我们学习了如何启动MySQL,并且了解了在启动程序之后,客户端和服务器端执行的一系列操作,从中可以更深入的了解MySQL的执行过程,希望这些对今后使用MySQL有所帮助哦~
欢迎关注留言,一起学习进步!
猜你喜欢
- 2024-10-09 「干货」如何进行 MySQL 用户管理?
- 2024-10-09 仅凭一条SQL,领悟MySQL的全貌(一条sql只能使用一个索引吗)
- 2024-10-09 Mysql语法基本操作(笔记)(mysql语法规范有哪些)
- 2024-10-09 好程序员Java学习路线分享MySQL目录结构
- 2024-10-09 MYSQL 登录与退出,查看当前数据库
- 2024-10-09 图解MySQL执行一条SQL的过程(mysql执行sql文件命令步骤)
- 2024-10-09 MySQL文件结构、逻辑架构及sql执行流程分析
- 2024-10-09 MySQL数据库解读之-目录结构(mysql的数据目录)
- 2024-10-09 MySQL命令总结(mysqld命令)
- 2024-10-09 kubernetes-5:mysql容器化(容器 mysql)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- spire.doc (59)
- system.data.oracleclient (61)
- 按键小精灵源码提取 (66)
- pyqt5designer教程 (65)
- 联想刷bios工具 (66)
- c#源码 (64)
- graphics.h头文件 (62)
- mysqldump下载 (66)
- sqljdbc4.jar下载 (56)
- libmp3lame (60)
- maven3.3.9 (63)
- 二调符号库 (57)
- 苹果ios字体下载 (56)
- git.exe下载 (68)
- diskgenius_winpe (72)
- pythoncrc16 (57)
- solidworks宏文件下载 (59)
- qt帮助文档中文版 (73)
- satacontroller (66)
- hgcad (64)
- bootimg.exe (69)
- android-gif-drawable (62)
- axure9元件库免费下载 (57)
- libmysqlclient.so.18 (58)
- springbootdemo (64)
本文暂时没有评论,来添加一个吧(●'◡'●)