一, MySQL 是客户端 / 服务器架构
1)macOS 操作系统上的默认安装目录:/usr/local/MySQL/
在 MySQL 的安装目录下有一个 bin 目录, 这个目录下存放着许多可执行文件.
2) 将该 bin 目录的路径加入到环境变量 PATH 中
如果我们觉得每次执行一个文件都要输入一串长长的路径名太麻烦的话, 可以把该 bin 目录所在的路径添加到环境变量 PATH 中. 环境变量 PATH 是一系列路径的集合, 各个路径之间使用冒号: 隔离开, 比方说我的机器上的环境变量 PATH 的值就是:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
3) 启动 MySQL 服务器程序
在类 UNIX 系统中用来启动 MySQL 服务器程序的可执行文件有很多, 大多在 MySQL 安装目录的 bin 目录下
mysqld
mysqld 这个可执行文件就代表着 MySQL 服务器程序, 运行这个可执行文件就可以直接启动一个服务器进程. 但这个命令不常用, 我们继续往下看更牛逼的启动命令.
mysqld_safe
mysqld_safe 是一个启动脚本, 它会间接的调用 mysqld, 而且还顺便启动了另外一个监控进程, 这个监控进程在服务器进程挂了的时候, 可以帮助重启它. 另外, 使用 mysqld_safe 启动服务器程序时, 它会将服务器程序的出错信息和其他诊断信息重定向到某个文件中, 产生出错日志, 这样可以方便我们找出发生错误的原因.
MySQL.server
MySQL.server 也是一个启动脚本, 它会间接的调用 mysqld_safe, 在调用 MySQL.server 时在后边指定 start 参数就可以启动服务器程序了, 就像这样:
MySQL.server start
需要注意的是, 这个 MySQL.server 文件其实是一个链接文件, 它的实际文件是 ../support-files/MySQL.server. 我使用的 macOS 操作系统会帮我们在 bin 目录下自动创建一个指向实际文件的链接文件, 如果你的操作系统没有帮你自动创建这个链接文件, 那就可以自己创建一个
另外, 我们还可以使用 MySQL.server 命令来关闭正在运行的服务器程序, 只要把 start 参数换成 stop 就好了: MySQL.server stop
mysqld_multi
其实我们一台计算机上也可以运行多个服务器实例, 也就是运行多个 MySQL 服务器进程. mysql_multi 可执行文件可以对每一个服务器进程的启动或停止进行监控. 这个命令的使用相对比较复杂 .
4) 启动 MySQL 客户端程序
MySQL -h 主机名 -P 端口 -u 用户名 -p 密码
断开连接 quit exit \q
二, 一个 select 语句处理过程会涉及哪些部分
1) 连接管理
客户端进程采用 TCP/IP 来与远程服务器进程建立连接, 每当有一个客户端进程连接到服务器进程时, 服务器进程都会创建一个线程来专门处理与这个客户端的交互, 当该客户端退出时会与服务器断开连接, 服务器并不会立即把与该客户端交互的线程销毁掉, 而是把它缓存起来, 在另一个新的客户端再进行连接时, 把这个缓存的线程分配给该新客户端. MySQL 服务器会为每一个连接进来的客户端分配一个线程, 但是线程分配的太多了会严重影响系统性能, 所以我们也需要限制一下可以同时连接到服务器的客户端数量.
当连接建立后, 与该客户端关联的服务器线程会一直等待客户端发送过来的请求, MySQL 服务器接收到的请求只是一个文本消息, 该文本消息还要经过各种处理.
2) 解析与优化
1, 查询缓存
虽然查询缓存有时可以提升系统性能, 但也不得不因维护这块缓存而造成一些开销, 比如每次都要去查询缓存中检索, 查询请求处理完需要更新查询缓存, 维护该查询缓存对应的内存区域. 从 MySQL 5.7.20 开始, 不推荐使用查询缓存, 并在 MySQL 8.0 中删除
2, 语法解析
MySQL 服务器程序首先要对这段文本做分析, 判断请求的语法是否正确, 然后从文本中将要查询的表, 各种查询条件都提取出来放到 MySQL 服务器内部使用的一些数据结构上来. 涉及词法解析, 语法分析, 语义分析等阶段.
3, 查询优化
语法解析之后, 服务器程序获得到了需要的信息, 比如要查询的列是哪些, 表是哪个, 搜索条件是什么等等. 我们写的 MySQL 语句执行起来效率可能并不是很高, MySQL 的优化程序会对我们的语句做一些优化. 优化的结果就是生成一个执行计划, 这个执行计划表明了应该使用哪些索引进行查询, 表之间的连接顺序是啥样的. 我们可以使用 EXPLAIN 语句来查看某个语句的执行计划 .
4, 存储引擎
截止到服务器程序完成了查询优化为止, 还没有真正的去访问真实的数据表, MySQL 服务器把数据的存储和提取操作都封装到了一个叫存储引擎的模块里. 我们知道表是由一行一行的记录组成的, 但这只是一个逻辑上的概念, 物理上如何表示记录, 怎么从表中读取数据, 怎么把数据写入具体的物理存储器上, 这都是存储引擎负责的事情. 为了实现不同的功能, MySQL 提供了各式各样的存储引擎, 不同存储引擎管理的表具体的存储结构可能不同, 采用的存取算法也可能不同.
为了管理方便, 人们把连接管理, 查询缓存, 语法解析, 查询优化这些并不涉及真实数据存储的功能划分为 MySQL server 的功能, 把真实存取数据的功能划分为存储引擎的功能. 各种不同的存储引擎向上边的 MySQL server 层提供统一的调用接口 (也就是存储引擎 API), 包含了几十个底层函数, 像 "读取索引第一条内容","读取索引下一条内容","插入记录" 等等.
所以在 MySQL server 完成了查询优化后, 只需按照生成的执行计划调用底层存储引擎提供的 API, 获取到数据后返回给客户端就好了. 最常用的就是 InnoDB 和 MyISAM .
相关命令:
查看当前服务器程序支持的存储引擎
SHOW ENGINES;
其中的 Support 列表示该存储引擎是否可用, DEFAULT 值代表是当前服务器程序的默认存储引擎. Comment 列是对存储引擎的一个描述, 英文的, 将就着看吧. Transactions 列代表该存储引擎是否支持事务处理. XA 列代表着该存储引擎是否支持分布式事务. Savepoints 代表着该存储引擎是否支持部分事务回滚.
创建表时指定存储引擎
CREATE TABLE 表名 (
建表语句;
) ENGINE = 存储引擎名称;
修改表的存储引擎
ALTER TABLE 表名 ENGINE = 存储引擎名称;
查看表结构
SHOW CREATE TABLE engine_demo_table
来源: http://www.bubuko.com/infodetail-3327385.html