MySQL(执行过程、索引、事务)

SQL架构

客户端(用户)连接 MySQL。
MySQL主要分为为两层:Server层和存储引擎。 有点类似于计算机网络中的分层结构,两层各自负责自己的事务。
在这里插入图片描述

MySQL主要包括两个部分:

  • Server层
    • 包括连接器 、解析器、执行器
    • 建立与客户端的连接、分析和执行SQL。
    • 对SQL语句进行词法分析、语法分析,优化SQL,确定执行执行计划
    • 调用存储引擎的API接口
  • 存储引擎(目前主流的是InnoDB
    • 存储引擎层负责数据的存储和提取

执行SQL的流程:

  1. 预处理阶段: 检查SQL里字段是否存在、 “*”补充为所有列。
  2. 优化阶段: 确定执行方案
  3. **执行阶段:**执行

MySQL连接

基于tcp进行连接
连接数量有最大值
空闲连接超过一定时间会断掉

MySQL数据的存储

主要有三个文件

文件(关键是后缀名)存储的内容
dp.opt默认字符集,字符校验规则
t_order.frm表结构
t_order.ibd表数据

数据库表中的记录都是按行(row)进行存放的,每行记录根据不同的行格式,有不同的存储结构。

Compact 行格式:
Compa行格式

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 TreeB树的非叶子节点中存放了整行数据,这样的话,在进行查询时,一次I/O读入的索引数会相对较少,从而导致I/O次数增加,影响查询效率。
二叉树如果使用二叉树的话,会导致二叉树比较深,树的深度代表了I/O次数
HashHash适合做范围查询,而且冲突问题不好解决

联合索引

对多个列建立索引,使用联合索引时,要遵循最左匹配原则。
例如对 a、b、c列建立索引,其实是先把a排序,在对b排序、在对c排序
a是全局有序的,b和c是局部有序的

唯一索引是建立子阿UNIQUE字段上的索引,允许有空值

索引失效

  1. 左模糊匹配:“%林”
  2. 对索引使用函数:length(name)= 6
  3. 对索引使用表达式计算: id + 1 = 10
  4. 对索引使用隐式类型转换
  5. 联合索引非最左匹配
  6. 索引列 or 非索引列: “where id = 1 or age = 18”

count

执行速度:
count(*) = count(1) > count(主键) > count(非主键字段)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值