阅读笔记:从根⼉上理解MySQL(⼀)
(⼀)初识 MySQL
MySQL 的客户端/服务器架构
和我们平时使⽤的⼤部分软件⼀样,MySQL 由这两部分组成(客户端和服务器),它的使⽤过程⼤致是:服务器程序直接和我们存储的数据打交道,然后可以有多个客户端程序连接到这个服务器程序,发送增删改查的请求,服务器接收到这些请求后响应,从⽽操作它维护的数据。
MySQL 服务器程序和客户端程序本质上都算是计算机上的⼀个进程,每个进程都有⼀个唯⼀的编号,称为进程ID,英⽂名叫 PID,这个编号是在我们启动程序的时候由操作系统随机分配的(每次启动时可能都不⼀样)。每个进程都有⼀个名称,这个名称是编写程序的⼈⾃⼰定义的,⽐如我们启动的 MySQL 服务器进程的默认名称为 mysqld, ⽽我们常⽤的MySQL客户端进程的默认名称为 mysql。
MySQL 的安装
⼀般我们正常安装 MySQL 的话都会把服务器程序和客户端程序装到我们的机器⾥,安装时注意记住你的安装⽬录(安装跳过)。
以在 UNIX 操作系统的安装⽬录为例:
/usr/local/mysql/
在 MySQL 的安装⽬录下有⼀个特别重要的 bin ⽬录,这个⽬录下存放着许多可执⾏⽂件:
/usr/local/mysql/bin
假设我们现在所处的⼯作⽬录是 MySQL 的安装⽬录,也就是 /usr/local/mysql,我们想启动 bin ⽬录下的 mysqld 这个可执⾏⽂件,可以使⽤相对路径来启动:
./bin/mysqld
或者直接输⼊ mysqld 的绝对路径也可以:
/usr/local/mysql/bin/mysqld
⼜或者将该 bin ⽬录的路径加⼊到环境变量 PATH 中,各个路径之间使⽤冒号":"隔离开:
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
上⾯例⼦中的环境变量 PATH 的值表明:当我在输⼊⼀个命令时,系统便会在 /usr/local/bin、/usr/bin、/bin、/usr/sbin、/sbin 这些⽬录下依次寻是否存在我们输⼊的那个命令(如
果存在则执⾏),将 MySQL 安装⽬录下的bin⽬录的路径也加⼊到 PATH 中:
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/mysql/bin
这样现在不论我们所处的⼯作⽬录是啥,我们都可以直接输⼊可执⾏⽂件的名字就可以启动它,⽐如这样:
mysqld
启动 MySQL 服务器程序
mysqld
mysqld 这个可执⾏⽂件就代表着 MySQL 服务器程序,运⾏这个可执⾏⽂件就可以直接启动⼀个服务器进程,另外还有mysqld_safe、mysql.server、mysqld_multi 等启动命令,之前倒没怎么⽤过。
这⾥穿插⼀下 Windows 服务(之前没了解过)
Windows 服务
如果需要长时间的运⾏某个程序,并且在计算机启动的时候便启动它,⼀般我们都会把它注册为⼀个
Windows 服务,操作系统会帮我们管理它。把某个程序注册为 Windows 服务的⽅式挺简单,如下:
"完整的可执⾏⽂件路径" --install [-manual] [服务名]
其中的 -manual 可以省略,加上它的话表⽰在 Windows 系统启动的时候不⾃动启动该服务,否则会⾃动启动。服务名也可以省略,默认的服务名就是 MySQL。⽐如我的 Windows 计算机上 mysqld 的完整路径是:
C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld
所以如果我们想把它注册为服务的话可以在命令⾏⾥这么写:
"C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld" --install
在把 mysqld 注册为 Windows 服务之后,我们就可以通过下边这个命令来启动 MySQL 服务器程序了:
net start MySQL
关闭这个服务也⾮常简单,只要把上边的 start 换成 stop 就⾏了:
net stop MySQL
启动 MySQL 客户端程序
在成功启动 MySQL 服务器程序后,就可以接着启动客户端程序来连接到这个服务器了,这⾥主要使⽤ bin ⽬录下的可执⾏⽂件 mysql。启动这个可执⾏⽂件时⼀般需要⼀些参数,格式如下:
mysql -h主机名  -u⽤户名 -p密码
按照你的情况填写就可以启动 MySQL 客户端,并且连接到服务器了。
mysql -hlocalhost -uroot -p123456
连接成功后的界⾯:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.21 Homebrew
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
最后⼀⾏的 mysql> 是⼀个客户端的提⽰符,之后客户端发送给服务器的命令都需要写在这个提⽰符后边。
如果需要断开连接并且关闭客户端的话,可以在 mysql> 提⽰符后输⼊下边任意⼀个命令:
1.  quit
2.  exit
3.  \q
mysql> quit
Bye
服务器处理客户端请求
⼤部分服务器程序处理来⾃客户端的查询请求需要经过三个部分,分别是连接管理、解析与优化、存储引擎。
连接管理
每当有客户端断开连接,服务器并不会⽴即把与该客户端交互的线程销毁掉,⽽是把它缓存起来,从⽽节省开销。
如果客户端程序和服务器程序不运⾏在⼀台计算机上,可以采⽤使⽤了 SSL(安全套接字)的⽹络连接进⾏通信,来保证数据传输的安全性。
当连接建⽴后,服务器线程会⼀直等待客户端发送过来的请求,MySQL 服务器接收到的请求只是⼀个⽂本消息,想执⾏该⽂本消息还要经过各种解析和优化。
解析与优化
拿到了⽂本形式的请求,还需要经过⼏个重要的过程,分别是查询缓存、语法解析和查询优化
查询缓存
如果我问你 123 × 456 = ?,你可能会动脑去算⼀下,得到了结果 56088,如果我再问你⼀遍 123 × 456 = ?我们便可以跳过计算过程直接说答案就好了(缓存)。MySQL 也会把刚刚处理过的查询请求和结果缓存起来,并且这个查询缓存可以在不同客户端之间共享。
缓存失效的情况:①任何字符上的不同(例如:空格、注释、⼤⼩写)  ②包含系统函数、⽤户⾃定义变量和函数、⼀些系统表  ③表的结构或者数据被修改。
语法解析
从指定的⽂本中提取出我们需要的信息本质上算是⼀个编译过程,涉及词法解析、语法分析、语义分析等阶段。
查询优化
语法解析之后,已经知道了要查询的列是哪些,表是哪个,搜索条件是什么等,但 SQL 语句执⾏起来的效率可能不⾼,MySQL 的优化程序会对我们的语句做⼀些优化,如外连接转换为内连接、表达式简化、⼦查询转为连接等。优化的结果就是⽣成⼀个执⾏计划,这个执⾏计划表明了应该使⽤哪些索引进⾏查询,表之间的连接顺序是怎样的,执⾏计划可⽤ EXPLAIN 语句查看。
存储引擎
截⽌到服务器程序完成了查询优化为⽌,还没有真正的去访问真实的数据表,MySQL服务器把数据的存储和提取操作都封装到了⼀个叫存储引擎的模块⾥。我们知道表是由⼀⾏⼀⾏的记录组成的,但这只是⼀个逻辑上的概念,物理上如何表⽰记录,怎么从表中读取数据,怎么把数据写⼊具体的物理存储器上,这都是存储引擎负责的事情。为了实现不同的功能,MySQL 提供了各式各样的存储引擎,不同存储引擎管理的表具体的存储结构可能不同,采⽤的存取算法也可能不同。
常⽤的存储引擎有 InnoDB、MyISAM 和 Memory(置于内存的表)
关于存储引擎的⼀些操作
查看当前服务器程序⽀持的存储引擎:
SHOW ENGINES;
设置表的存储引擎
前边说过,存储引擎是负责对表中的数据进⾏提取和写⼊⼯作的,我们可以为不同的表设置不同的存储引擎,也就是说不同的表可以有不同的物理存储结构,不同的提取和写⼊⽅式。
创建表时指定存储引擎:
CREATE TABLE 表名(
建表语句;
) ENGINE = 存储引擎名称;
⽐如想创建⼀个存储引擎为 MyISAM 的表可以这么写:
mysql> CREATE TABLE engine_demo_table(
->    i int
-> ) ENGINE = MyISAM;
Query OK, 0 rows affected (0.02 sec)
mysql>
修改表的存储引擎
如果表已经建好了,可以使⽤下边这个语句来修改表的存储引擎:
ALTER TABLE 表名 ENGINE = 存储引擎名称;
⽐如我们修改⼀下 engine_demo_table 表的存储引擎:
mysql> ALTER TABLE engine_demo_table ENGINE = InnoDB;
Query OK, 0 rows affected (0.05 sec)mysql下载后为啥localhost打不开
Records: 0  Duplicates: 0  Warnings: 0
mysql>
这时再查看⼀下 engine_demo_table 的表结构:
mysql> SHOW CREATE TABLE engine_demo_table\G *************************** 1. row ***************************
Table: engine_demo_table
Create Table: CREATE TABLE `engine_demo_table` (  `i` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.01 sec)
mysql>
可以看到该表的存储引擎已经改为 InnoDB 了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。