Windows
删除服务: sc delete mysql
1.mysqld :代表着MySQL
服务器程序,运行这个可执行文件就可以直接启动一个服务器进程。但这个命令不常用
以服务的方式运行服务器程序
首先看看什么是个Windows
服务?如果无论是谁正在使用这台计算机,我们都需要长时间的运行某个程序,而且需要在计算机启动的时候便启动它,一般我们都会把它注册为一个Windows 服务
,操作系统会帮我们管理它。把某个程序注册为Windows
服务的方式挺简单,如下:
"完整的可执行文件路径" --install [-manual] [服务名] -manual表示windows启动时不自动启动,服务名可以省略,默认是MySQL
注册,启动,结束
启动MySQL客户端程序
在我们成功启动MySQL
服务器程序后,就可以接着启动客户端程序来连接到这个服务器喽,bin
目录下有许多客户端程序,比方说mysqladmin
、mysqldump
、mysqlcheck
等等等等。这里我们重点要关注的是可执行文件mysql
,通过这个可执行文件可以让我们和服务器程序进程交互,也就是发送请求,接受服务器的处理结果。启动这个可执行文件时一般需要一些参数,格式如下:
mysql -h主机名 -u用户名 -p密码
mysql --host=localhost --user=root --password=root
tips
1:如果服务器进程运行在本地的话,可以省略 -h ,或者填localhost,127.0.0.1
2. 可以写成 -- host = 主机名 --user = 用户名 --password = 密码 (注意双短线,缩写单短线)
3.-p
和密码值之间不能有空白字符(其他参数可以)
4.连接成功后,mysql>quit (exit ,\q都可以退出)关闭客户端
ADVICE
1. 密码不可见
2 . 如果你使用的是类UNIX
系统,并且省略-u
参数后,会把你登陆操作系统的用户名当作MySQL
的用户名去处理。
比方说我用登录操作系统的用户名是cxy
,那么在我的机器上下边这两条命令是等价的:
mysql -u cxy -p
mysql -p
对于Windows
系统来说,默认的用户名是ODBC
,你可以通过设置环境变量USER
来添加一个默认用户名。
客户端与服务器连接的过程
杀进程
上面介绍了如何启动MySQL
的服务器程序,以及如何启动客户端程序来连接到这个服务器程序。运行着的服务器程序和客户端程序本质上都是计算机上的一个进程,所以客户端进程向服务器进程发送请求并得到回复的过程本质上是一个进程间通信的过程!MySQL
支持下边三种客户端进程和服务器进程的通信方式。
TCP/IP
也就是ip+端口号的方式,MySQL
服务器启动的时候会默认申请3306
端口号,之后就在这个端口号上等待客户端进程进行连接,用书面一点的话来说,MySQL
服务器会默认监听3306
端口(show global variables like ‘port‘;) 查看
如何改变服务器监听的端口号
服务器处理客户端请求
无论哪种方式,过程都是客户端发送mysql 语句,服务端返回处理结果
连接管理
客户端进程可以采用我们上边介绍连接方式之一来与服务器进程建立连接,每当有一个客户端进程连接到服务器进程时,服务器进程都会创建一个线程来专门处理与这个客户端的交互,当该客户端退出时会与服务器断开连接,服务器并不会立即把与该客户端交互的线程销毁掉,而是把它缓存起来,在另一个新的客户端再进行连接时,把这个缓存的线程分配给该新客户端。这样就起到了不频繁创建和销毁线程的效果,从而节省开销。从这一点大家也能看出,MySQL
服务器会为每一个连接进来的客户端分配一个线程,但是线程分配的太多了会严重影响系统性能,所以我们也需要限制一下可以同时连接到服务器的客户端数量,至于怎么限制我们后边再说哈~
在客户端程序发起连接的时候,需要携带主机信息、用户名、密码,服务器程序会对客户端程序提供的这些信息进行认证,如果认证失败,服务器程序会拒绝连接。另外,如果客户端程序和服务器程序不运行在一台计算机上,我们还可以采用使用了SSL
(安全套接字)的网络连接进行通信,来保证数据传输的安全性。
当连接建立后,与该客户端关联的服务器线程会一直等待客户端发送过来的请求,MySQL
服务器接收到的请求只是一个文本消息,该文本消息还要经过各种处理,预知后事如何,继续往下看哈~
解析与优化
到现在为止,MySQL
服务器已经获得了文本形式的请求
查询缓存(8.0删除了)
如果我问你9+8×16-3×2×17
的值是多少,你可能会用计算器去算一下,或者牛逼一点用心算,最终得到了结果35
,如果我再问你一遍9+8×16-3×2×17
的值是多少,你还用再傻呵呵的算一遍么?我们刚刚已经算过了,直接说答案就好了。MySQL
服务器程序处理查询请求的过程也是这样,会把刚刚处理过的查询请求和结果缓存
起来,如果下一次有一模一样的请求过来,直接从缓存中查找结果就好了,就不用再傻呵呵的去底层的表中查找了。这个查询缓存可以在不同客户端之间共享,也就是说如果客户端A刚刚查询了一个语句,而客户端B之后发送了同样的查询请求,那么客户端B的这次查询就可以直接使用查询缓存中的数据。
当然,MySQL
服务器并没有人聪明,如果两个查询请求在任何字符上的不同(例如:空格、注释、大小写),都会导致缓存不会命中。另外,如果查询请求中包含某些系统函数、用户自定义变量和函数、一些系统表,如 mysql 、information_schema、 performance_schema 数据库中的表,那这个请求就不会被缓存。以某些系统函数举例,可能同样的函数的两次调用会产生不一样的结果,比如函数NOW
,每次调用都会产生最新的当前时间,如果在一个查询请求中调用了这个函数,那即使查询请求的文本信息都一样,那不同时间的两次查询也应该得到不同的结果,如果在第一次查询时就缓存了,那第二次查询的时候直接使用第一次查询的结果就是错误的!
不过既然是缓存,那就有它缓存失效的时候。MySQL的缓存系统会监测涉及到的每张表,只要该表的结构或者数据被修改,如对该表使用了INSERT
、 UPDATE
、DELETE
、TRUNCATE TABLE
、ALTER TABLE
、DROP TABLE
或 DROP DATABASE
语句,那使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除!
小贴士: 虽然查询缓存有时可以提升系统性能,但也不得不因维护这块缓存而造成一些开销,比如每次都要去查询缓存中检索,查询请求处理完需要更新查询缓存,维护该查询缓存对应的内存区域。从MySQL 5.7.20开始,不推荐使用查询缓存,并在MySQL 8.0中删除。
语法解析
如果查询缓存没有命中,接下来就需要进入正式的查询阶段了。因为客户端程序发送过来的请求只是一段文本而已,所以MySQL
服务器程序首先要对这段文本做分析,判断请求的语法是否正确,然后从文本中将要查询的表、各种查询条件都提取出来放到MySQL
服务器内部使用的一些数据结构上来。
小贴士: 这个从指定的文本中提取出我们需要的信息本质上算是一个编译过程,涉及词法解析、语法分析、语义分析等阶段,这些问题不属于我们讨论的范畴,大家只要了解在处理请求的过程中需要这个步骤就好了。
查询优化
语法解析之后,服务器程序获得到了需要的信息,比如要查询的列是哪些,表是哪个,搜索条件是什么等等,但光有这些是不够的,因为我们写的MySQL
语句执行起来效率可能并不是很高,MySQL
的优化程序会对我们的语句做一些优化,如外连接转换为内连接、表达式简化、子查询转为连接吧啦吧啦的一堆东西。优化的结果就是生成一个执行计划,这个执行计划表明了应该使用哪些索引进行查询,表之间的连接顺序是啥样的。我们可以使用EXPLAIN
语句来查看某个语句的执行计划,关于查询优化这部分的详细内容我们后边会仔细唠叨,现在你只需要知道在MySQL
服务器程序处理请求的过程中有这么一个步骤就好了。
存储引擎
服务器程序完成了查询优化为止,还没有真正的去访问真实的数据表,MySQL
服务器把数据的存储和提取操作都封装到了一个叫存储引擎
的模块里。我们知道表
是由一行一行的记录组成的,但这只是一个逻辑上的概念,物理上如何表示记录,怎么从表中读取数据,怎么把数据写入具体的物理存储器上,这都是存储引擎
负责的事情。为了实现不同的功能,MySQL
提供了各式各样的存储引擎
,不同存储引擎
管理的表具体的存储结构可能不同,采用的存取算法也可能不同。
小贴士: 为什么叫`引擎`呢?因为这个名字更拉风~ 其实这个存储引擎以前叫做`表处理器`,后来可能人们觉得太土,就改成了`存储引擎`的叫法,它的功能就是接收上层传下来的指令,然后对表中的数据进行提取或写入操作。
为了管理方便,人们把连接管理
、查询缓存
、语法解析
、查询优化
这些并不涉及真实数据存储的功能划分为MySQL server
的功能,把真实存取数据的功能划分为存储引擎
的功能。各种不同的存储引擎向上边的MySQL server
层提供统一的调用接口(也就是存储引擎API),包含了几十个底层函数,像"读取索引第一条内容"、"读取索引下一条内容"、"插入记录"等等。
所以在MySQL server
完成了查询优化后,只需按照生成的执行计划调用底层存储引擎提供的API,获取到数据后返回给客户端就好了。
最常用的就是InnoDB
和MyISAM
,有时会提一下Memory
。其中InnoDB
是MySQL
默认的存储引擎
SHOW ENGINES;查看服务器支持哪些
Support
列表示该存储引擎是否可用,DEFAULT
值代表是当前服务器程序的默认存储引擎。Comment
列是对存储引擎的一个描述,英文的,将就着看吧。Transactions
列代表该存储引擎是否支持事务处理。XA
列代表着该存储引擎是否支持分布式事务。Savepoints
代表着该列是否支持部分事务回滚。
设置表的存储引擎
存储引擎是负责表数据的提取和写入的,可以为不同的表指定不同的存储引擎
- 建表时:CREATE TABLE 表名( 建表语句; ) ENGINE = 存储引擎名称;
- 修改表: ALTER TABLE 表名 ENGINE = 存储引擎名称;