Xing
5 min

简介

事物

事物特性

ACID 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
原子性:保证事物为最小单元不可切分
一致性:保证事物要么全部成功,要么全部失败
隔离性:当前事物不能被其他事物影响
持久性:事物一旦提交就是永久储存

事物隔离级别

读未提交(READ UNCOMMITTED)
读提交 (READ COMMITTED)
可重复读 (REPEATABLE READ)
串行化 (SERIALIZABLE)

脏读:读取到了其他事物未提交的数据。
幻读:幻读一般出现在新增场景,例如更新某个表全部数据时,此时另外一个事物提交了一条新数据,而更新操作以及执行完,但是有一条数据没有更新到。 可重复读:在同一事物内,多次执行同一查询语句,查询的结果是一致的。
不可重复读:.....查询的结果是不一致的

脏读不可重复读幻读
读未提交
读提交
可重复读
串行化

关键字执行顺序

FROM <left_table>
ON <join_condition>
<join_type> JOIN <right_table>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
SELECT
DISTINCT <select_list>
ORDER BY <order_by_condition>
LIMIT <limit_number>

on与where的区别

数据库在关联多张表时会生成一个临时表,left/right join时会忽略on里的条件,将主表的所有记录先放到临时表里,这时on里的多个条件就失效了。
where是在关联后再做的匹配,即对笛卡尔积做一个匹配,所以能匹配出正确的结果。 只有 left/right/full join时会有这种情况。 inner join 下on和where结果一致没区别。

exists与in的区别

in的条件是某一个字段是否匹配,exists的条件是个boolean。 in先查询子表再将查询结果以参数形式给到外表,exists先查询外表再迭代所有记录根据exists判断是否要显示该记录。 in一般适用外表数据量较大内表数据量较小场景。 exists一般适用外表数据量较小内表数据量较大场景

select * from A where id in (select id from B)
select * from A where exists (select 1 from B where B.id = A.id)

窗口函数

窗口函数是MySQL8提供的新特性

函数 OVER([PARTITION BY 字段名 ORDER BY 字段名 ASC|DESC])
函数 OVER 窗口名 ... WINDOW 窗口名 AS ([PARTITION BY 字段名 ORDER BY 字段名 ASC|DESC])

OVER 关键字指定函数窗口的范围,如果省略后面括号中的内容,则窗口会包含满足WHERE条件的所有记录,窗口函数会基于所 有满足WHERE条件的记录进行计算。 如果OVER关键字后面的括号不为空,则可以使用如下语法设置窗口。
窗口名:为窗口设置一个别名,用来标识窗口。
PARTITION BY子句:指定窗口函数按照哪些字段进行分组。分组后,窗口函数可以在每个分组中分 别执行。
ORDER BY子句:指定窗口函数按照哪些字段进行排序。执行排序操作使窗口函数按照排序后的数据 记录的顺序进行编号。
FRAME子句:为分区中的某个子集定义规则,可以用来作为滑动窗口使用

SELECT 
    *
FROM (
    SELECT 
    ROW_NUMBER() OVER(PARTITION BY category_id ORDER BY price DESC) AS row_num, id, category_id, category, NAME, price, stock
FROM goods) t


SELECT RANK() OVER w AS r, PERCENT_RANK() OVER w AS pr, id, category_id, category, NAME, price, stock
FROM goods
WHERE category_id = 1 
WINDOW w AS (PARTITION BY category_id ORDER BY price DESC);

逻辑架构

客户端 --> 连接管理 --> 解析与优化 --> 存储引擎

连接管理 服务层 引擎层

sql -> 分析器 语法/语义分析 --> 优化器 逻辑优化/物理优化 --> 执行器

存储引擎区别 Myasim /innodb innodb支持事物 innodb 支持行锁 myasim性能较快

缓冲池

索引类型

MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。

  • 功能逻辑上说,索引有4种,分别是普通索引 唯一索引 主键索引 全文索引
  • 物理层面说索引可以分为聚簇索引 非聚簇索引.

MVCC及实现原理

锁升级

  • MySQL行锁只能加载索引上,如果操作不走索引则会升为表锁。
  • 非唯一索引上记录数超过一定数量时,行锁也会升级为表锁。(索引数量达到1/2时会锁全表)