SQL架构
客户端(用户)连接 MySQL。
MySQL主要分为为两层:Server层和存储引擎。 有点类似于计算机网络中的分层结构,两层各自负责自己的事务。
MySQL主要包括两个部分:
- Server层
- 包括连接器 、解析器、执行器
- 建立与客户端的连接、分析和执行SQL。
- 对SQL语句进行词法分析、语法分析,优化SQL,确定执行执行计划
- 调用存储引擎的API接口
- 存储引擎(目前主流的是InnoDB)
- 存储引擎层负责数据的存储和提取
执行SQL的流程:
- 预处理阶段: 检查SQL里字段是否存在、 “*”补充为所有列。
- 优化阶段: 确定执行方案
- **执行阶段:**执行
MySQL连接
基于tcp进行连接
连接数量有最大值
空闲连接超过一定时间会断掉
MySQL数据的存储
主要有三个文件
文件(关键是后缀名) | 存储的内容 |
---|---|
dp.opt | 默认字符集,字符校验规则 |
t_order.frm | 表结构 |
t_order.ibd | 表数据 |
数据库表中的记录都是按行(row)进行存放的,每行记录根据不同的行格式,有不同的存储结构。
Compact 行格式:
NULL如何储存,会不会存放在真实数据里?
NULL是不会存放在行格式中记录真实数据的,如果某行的某个字段为NULL,NULL列表中,该字段对应的位为1
varchar(n)中的n最大为多少?
n最大不会超过65535(16MB),n最大为:65532
索引
聚簇索引
聚簇索引:即主键索引。
使用的数据结构为:B+树。
B+树中的叶子节点才存放数据,非叶子节点只存放索引(主键值)
二级索引
二级索引:辅助索引。即非主键索引。
数据结构:B+树
叶子节点
主键索引的B+树的叶子节点存放的是实际数据,二级索引的B+树的叶子节点存饭的是主键值
回表与覆盖索引
回表:查询某个值 —> 通过二级索引 —> 拿到主键值 —> 通过主键索引找该字段 —> 叶子节点拿值
可以看到,这一次查询使用了两次B+树,所以叫回表
覆盖索引:如果通过某个条件查询的是主键值,那么回表中的“通过主键索引拿值”就无需进行,这种情况叫做覆盖索引
why B+ Tree?(为何使用B+ tree)
数据结构 | 与其相比 B+ Tree 的优点 |
---|---|
B+ Tree | 目前MySQL所使用的数据结构 |
B Tree | B树的非叶子节点中存放了整行数据,这样的话,在进行查询时,一次I/O读入的索引数会相对较少,从而导致I/O次数增加,影响查询效率。 |
二叉树 | 如果使用二叉树的话,会导致二叉树比较深,树的深度代表了I/O次数 |
Hash | Hash适合做范围查询,而且冲突问题不好解决 |
联合索引
对多个列建立索引,使用联合索引时,要遵循最左匹配原则。
例如对 a、b、c列建立索引,其实是先把a排序,在对b排序、在对c排序
a是全局有序的,b和c是局部有序的
唯一索引是建立子阿UNIQUE字段上的索引,允许有空值
索引失效
- 左模糊匹配:“%林”
- 对索引使用函数:length(name)= 6
- 对索引使用表达式计算: id + 1 = 10
- 对索引使用隐式类型转换
- 联合索引非最左匹配
- 索引列 or 非索引列: “where id = 1 or age = 18”
count
执行速度:
count(*) = count(1) > count(主键) > count(非主键字段)