1.1.1. 01.初识 MySQL


1.bin 目录下的可执行文件

我的 macOS 上路径为 /usr/local/Cellar/mysql/8.0.17/bin/

  1. mysqld mysqld 就代表着 Mysql 的服务器程序,运行这个程序就可以直接启动一个服务器进程。但是不常用。
  2. mysqld_safe mysqld_safe 是一个启动脚本,它会间接启动 mysqld,并启动一个监控进程,当 mysqld 挂了的时候,可以帮助重启它。mysqld_safe 还会产生一个错误日志,方便查询错误。
  3. mysql.server mysql.server 是一个启动脚本,会间接调用 mysqld_safe。它其实是一个链接,链接到 mysql.server -> ../support-files/mysql.server。

         # 启动 mysql.server
         mysql.server start
         # 关闭 
         mysql.server stop
    
  4. mysqld.multi 可以在同一台计算机上开多个服务器实例,也就是运行多个 mysql 进程。可以对每个进程的启动和停止做监控。

2.启动 mysql

    mysql -h主机名 -u用户名 -P端口号 -p密码
    # 不要明文在 -p 后面写密码,而是通过回车来输入密码
    Enter password:

3.服务器处理客户端请求

  1. 客户端请求服务器流程

服务器处理客户端请求

  1. 连接管理 客户端进程通过 TCP/IP、Unix 嵌套字等方式来与服务器进程建立连接。每当有一个客户端进程连接到服务器时,服务器进程会创建一个线程来与客户端交互,当客户端退出时,服务器端不会立即销毁该线程,而是把他缓存起来,等下个客户端连接时,把这个缓存的线程分配给新客户端,这样避免了频繁创建和销毁线程的作用,节省了服务器资源。

这里的连接方式,和 PHP-FPM 很像,不过 PHP-FPM 是通过一个 master 进程来管理 多个 worker 进程,当服务器有请求时,master 会把请求分发给其中一个 worker 来处理,处理完之后返回给服务器。并不会销毁 worker 进程,也避免了频繁创建和销毁进程的作用,借阅服务器资源

  1. 解析与优化 执行一条 sql 语句,mysql 会通过查询缓存、语法解析、查询优化三个方面来处理。

    1. 查询缓存 即当一个客户端执行完一条 sql 语句后,另一个客户端再执行完全相同的 sql 语句时,mysql 不会重复执行,它会把第一次查询的内容存入缓存,第二次查询的时候直接从缓存中取出结果。
      值得注意的事,首先只有当查询语句完全相同时(包括空格,注释,大小写),mysql 才会命中缓存。还有请求的是系统表和系统函数都不会被缓存。

      虽然查询缓存有时可以提升系统性能,但也不得不因维护这块缓存⽽造成⼀些开销,⽐如每次都要去查询缓存中检索,查询请求处理完需要更新查询缓存,维护该查询缓存对应的内存区域。从 MySQL5.7.20 开始,不推荐使⽤查询缓存,并在 MySQL8.0 中删除。

    2. 语法解析 当查询缓存没有命中,mysql 服务器就会将传过来的 sql 语句进行分析、判断语法是否正确,然后从⽂本中将要查询的表、各种查询条件 都提取出来放到 MySQL 服务器内部使⽤的⼀些数据结构上来。

    3. 查询优化 语法解析之后,服务器得到了需要的信息,如查询哪张表,哪些字段,什么条件,由于我们自己写的 sql 语句执行效率可能并不高,所以 mysql 的优化程序会做一些优化,如外连接转换为内连接、表达式简化、⼦查询转为连接等。

  1. 存储引擎 mysql 把数据的存储和操作都封装到了一个叫「存储引擎」的模块中。存储引擎封装着如物理上如何表示记录,如何把数据写入物理存储器,使用什么方法读取出来等等。 最常用的存储引擎是 InnoDB,MyISAM 。 InnoDB,行锁,支持事务与分布式事务,事务回滚。不支持全文索引 FULLTEXT。写慢,清空表时是一行行删除。 MyISAM,表索,不支持事务,支持全文索引,写快。
  1. 操作 创建表指定存储引擎
     create table 表名(
         建表语句
     )ENGINE = 存储引擎名称
    
    修改表引擎
     ALTER TABLE 表名 ENGINE = 存储引擎名称
    

查看引擎

    SHOW CREATE TABLE 表名

4.启动选项和配置文件

在命令⾏上使⽤选项

在启动时,可以增加选项来配置参数,如启动 mysql 时的 -h 选择主机名。

在启动时,在选项名加 -- 前缀,如果选项名是多个单词可以用下划线 _ 或者横杠 - 来链接。查询有哪些选项可以通过 --help 来查询。

    mysqld --skip_networking
    # 这两种写法等价 
    mysqld --skip-networking

    # 指定默认引擎为 MyISAM
    mysqld --default-storage-engine=MyISAM

选项有长形式和短形式,「--选项名」为长形式,「-字母」为短形式。

--host、-h 主机名 --user、-u 用户名 --password、-p 密码 --port、-P 端⼝

当使用 mysqld_safe 启动服务器时,对于传的启动选项 mysqld_safe 并不会处理,会传给 mysqld 来处理

    # mysqld_server 不会处理,将会把 --skip-networking 传递给 mysqld 处理
    mysqld_server --skip-networking
配置文件

在类 UNIX 操作系统中, MySQL 会按照下列路径来寻找配置⽂件:

路径名 备注
/etc/my.cnf
/etc/mysql/my.cnf
SYSCONFDIR/my.cnf
$MYSQL_HOME/my.cnf 特定于服务器的选项(仅限服务器)
defaults-extra-file 命令⾏指定的额外配置⽂件路径
~/.my.cnf ⽤户特定选项
~/.mylogin.cnf 用户特定的登录路径选项(仅限客户端)

配置文件下面,分别有 server、mysqld、mysqld_safe、client、mysql、mysqladmin 这几个组名。而不同的启动命令,能读取的组名下的配置是不一样的。

启动命令 类别 能读取的组
mysqld 启动服务器 [mysqld]、[server]
mysqld_safe 启动服务器 [mysqld]、[server]、[mysqld_safe]
mysql.server 启动服务器 [mysqld]、[server]、[mysql.server]
mysql 启动客户端 [mysql]、[client]
mysqladmin 启动客户端 [mysqladmin]、[client]
mysqldump 启动客户端 [mysqldump]、[client]

配置文件的优先级

  • 多个配置文件设置了相同的启动选项,则以最后一个配置文件中的为准 比如在 ~/.my.cnf 和 /etc/my.cnf 都设置了 default-storage-engine ,前者是 InnoDB,后者是 MyISAM,因为~/.my.cnf比/etc/my.cnf顺序靠后,所以如果两个配置文件中出现相同的启动选项,以~/.my.cnf中的为准,所以MySQL服务器程序启动之后,default-storage-engine的值就是MyISAM。

  • 同一个配置文件,多个组设置了相同的启动选项,则以最后一个出现的组为准 比方说例子中default-storage-engine既出现在[mysqld]组也出现在[server]组,因为[mysqld]组在[server]组后边,就以[mysqld]组中的配置项为准。

  • 如果同一个启动选项,同时出现在配置文件和命令行中,则以命令行为准

系统变量

大部分系统变量,可以在服务器运行的过程中进行动态修改而不用重启服务器。

通过 SET [GLOBAL 全局|SESSION 会话] 系统变量名 = 值; 设置系统变量

全局变量影响整个服务器操作,会话变量影响单个会话的操作。

    # 设置全局系统变量,两种写法等价
    set global default_storage_engine=InnoDB;
    set @@global.default_storage_engine=InnoDB;

    # 设置会话变量,三种写法等价
    SET SESSION default_storage_engine = MyISAM;
    SET @@SESSION.default_storage_engine = MyISAM;
    SET default_storage_engine = MyISAM;

通过 SHOW [GLOBAL|SESSION] VARIABLES [LIKE 匹配的模式]; 来查询。

    # 查询全局系统变量中有 default 的系统变量
    show global variables like "%default%";
    # 查询全局系统变量中客户端最大连接数
    show global variables like "max_connections";
    # 查询会话系统变量中系统默认引擎
    show session variables like "default_storage_engine";

注意:

  1. 并不是所有系统变量都具有 GLOBAL 和 SESSION 的作用范围。
     有一些只具有 gloabl 作用范围,如 max_connections 。
     有一些只具有 session 作用范围,如 insert_id,表示插入时 auto_increment 的值。
     有一些两个作用范围都有的,如 default_storage_engine。
    
  2. 有一些只读的系统变量,不能设置
     如 version,查看系统版本。
    
状态变量

状态变量表示服务器运行状况,这些是由服务器自己设置,所以不能修改。与系统变量类似,状态变量也分为全局和会话两种。

通过 SHOW [GLOBAL|SESSION] STATUS [LIKE 匹配的模式]; 查询。

    # 查询当前线程相关状态
    show session status like "thread%";

结果:

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 0     |
| Threads_connected | 1     |
| Threads_created   | 1     |
| Threads_running   | 1     |
+-------------------+-------+
4 rows in set (0.00 sec)
Copyright © Kagami丶 2019 all right reserved,powered by Gitbook该文件修订时间: 2019-12-10 21:47:13

results matching ""

    No results matching ""