目录
一、版本选择
Oracle MySQL、MariaDB、PerconaDB
市场主流版本:mysql 5.6(5.6.36,5.6.38,5.6.40)、5.7(5.7.18,2.7.20,5.7.22)
企业版本选择:6-12个月之间的GA版本
下载包下载选择:Source Code 需要编译后形成二进制的源码包、一般使用二进制版本,只要解压即可使用
二、MySQL体系结构
2-1 MySQL C/S结构
连接的两种方式:TCP/IP - (适用远程和本地)、SOCKET文件连接(仅适用本地连接)
2-1-1 TCP/IP连接
2-1-2 SOCKET文件连接
2-2 MySQL实例
实例 ≈ mysqld(后台守护进程) + 内存结构
2-2-1 mysqld 三层结构
连接层
- 提供连接协议(TCP、Socket)
- 用户验证
- 提供专用链接线程
SQL层
- 接受上层命令
- 语法检测
- 语义(SQL类型)、权限
- SQL类型:DDL(数据定义语言)、DCL(数据控制语言)、DML(数据操作语言)、DQL(数据查询)
- 专用解析器解析SQL,解析成多种执行计划
- 优化器,用于选择一个成本带价最低的执行计划(CPU、IO、MEM)
- 按照优化器的选择,执行SQL语句,得出获取数据的方法
- 查询缓存(默认关闭),将执行过的语句放入缓存内,用于之后同语句的查询快速返回结果
- 查询缓存开启的缺点:存入缓存的是语句的hash值,若hash值不同,即使结果相同也无法使用缓存内的语句。
- 一般使用redis产品替代查询缓存
- 记录日志(查询日志、二进制日志) - 可用于将来的数据恢复
存储引擎层
按照SQL层的结论(获取数据的方法),查询到相应数据,结构化成表形式
三、MySQL的逻辑结构
- 库(schema) - 存储表的地方(本质是目录)
- 表(Table)- 二维表
- 元数据
- 表名
- 表属性(表大小、表权限、存储引擎、字符集等)
- 列 - 列名、列属性(数据类型、约束等)
- 数据行(真实数据)
- 记录 - 数据行
四、SQL 语句
4-0 SQL语句的操作对象
- 库、表
4-1 SQL类型(满足SQL92标准)
- DDL(数据定义语言)
- 基于库操作
- CREATE DATABASE、DROP DATABASE、ALTER DATABASE
- SQL语句规范
- 关键字大写(非必须)、字面量小写 (必须)- CREATE DATABASE dbtest CHARSET utf8mb4;
- 库名只能是小写,不能由数字开头,不能是预留关键字
- 库名必须和业务相关 - his_user;
- 必须加字符集 - CHARSET utf8mb4;
- 基于表操作
- CREATE TABLE、DROP TABLE、ALTER TABLE
- SQL语句规范
- 关键字大写(非必须)、字面量小写 (必须)
- 表名只能是小写,不能由数字开头,不能是预留关键字
- 表名必须和业务相关
- 必须加字符集和存储引擎
- 使用合适的数据类型
- 必须存在主键
- 尽量添加非空
- 字段唯一性
- 必须添加注释
- 避免使用外键
- 建立合理的索引(基于表上的链建立索引)
- DCL(数据控制语言)
- grent、revoke、lock
- DML(数据操作语言)
- insert、update、delete
- SQL语句规范
- insert语句按批量插入数据
- update必须where条件
- delete尽量替换为update操作
- 清空全表需求,推荐使用truncate(物理清空),不推荐使用delete(逐条删除)
- DQL(数据查询)
- select、show
- SQL语句规范
- select语句避免使用*语句批量查询 - select * from t1; --替换成--> select id.name from t1
- select语句尽量加等值的where条件 - select * from t1 where id=20;
- select语句范围查询,尽量添加limit或者使用and条件进行切片
- select语句where条件不要使用 != 或 <> 或 like'%name'模糊查询 或 not、in、not exist
- join表连接不能出现3表以上的表连接,避免子查询
- where条件中不要出现函数操作