MySQL 基础笔记

1.Mysql 查询语句的执行顺序?

from...join...on...where...group by...having...select...order by...limit

2.Mysql 如何实现多表查询?

inner join,left outer join,right outer join, full outer join(mysql不支持,需要使用left + right + union 实现),cross join,子查询 in,派生表,union

3.MYSQL 内连接和外连接的区别 ?

内连接就是做交集,外连接就是在做交集的基础上保留左或右的差集。

4.CHAR 和 VARCHAR 的区别?

char 无论有没有达到字段长度统统按照设定的来,varchar 则是动态变化,没到最大长度就是当前长度。

5.什么是事务?

事务就是遵循 ACID 原则的一系列业务执行,在数据库中的事务就是不同事务直接隔离,并保持原子性,要不都成功,要不都失败回滚,事务一定是从一个状态到另一个状态,并且做出的修改时永久的。

6.ACID 是什么?可以详细说一下吗?

A 是原子性,事务里的 SQL 要不都执行要不都不执行;

C 是一致性;事务总是从一个状态到达另一个状态。

I 是隔离性,不同事务直接保持隔离,看不到对方的执行;

D 是持久性,事务带来的变化是永久的;

7.并发事务带来哪些问题?

并发事务会因为事务隔离级别不同而导致不同的问题:

首先就是读未提交,不同事务并发执行,因为可以读其他事务尚未提交的数据,所以会导致读脏数据;

接着就是读已提交,虽然事务只能读已经提交后的数据,但是因为同一个事务中可能要重复读同一数据,在这个时间间隔,其他并发事务就有机会修改数据,导致无法重复读;

再者就是可重复读,通过行级锁,快照等机制,对当前事务读取的数据留存副本,即使被修改依旧可以读原先的数据,但是无法保证范围查询时多插入的合乎规则的数据的乱入,导致幻读;

最后就是串行事务,虽然解决了并发事务的问题,但是很明显不在讨论范围内。

8.怎么解决这些问题呢?MySQL 的默认隔离级别是?

MySQL,默认的隔离级别是可重复读,可以解决除开幻读外的问题,可以采用 MVCC 多版本控制利用快照实现可重复读,或者记录锁(锁定单行),间隙锁(锁定范围),临键锁(record + gap)。

9.MYSQL 支持的存储引擎有哪些,有什么区别 ?

MYSQL 支持的存储引擎有 MyISAMInnoDB;

MyISAM 支持表级锁,InnoDB 支持行级锁;

MyISAM 不支持事务,InnoDB 支持事务;

MyISAM 不支持 MVCC,InnoDB 支持 MVCC;

MyISAM 不支持全文索引,InnoDB 支持全文索引;

10.MYSQL 主从同步原理

MySql 主从同步原理其实就是 master 将库表的 DDL,DML 除开查询语句等 SQL 通过二进制的形式存储到 binlog 中,而 slave 则读取 master 的 slaver 持久化到 slave 的 relaylog 中,并重放 relaylog 中的语句,使得 slave 中的数据与 master 保持延迟同步。

11.读写分离的时候主从同步延时怎么解决?

读写分离即主库写,从库负责读,因为主从同步演示导致读数据读到了旧数据,可以通过强制某些需要强一致性的请求只能通过主库读,或者通过中间件监控从库延迟,当延迟过高则动态选择延迟低的从库或主库中读,亦或者,半同步复制主库写后,需要有从库返回已经同步 binlog 到 relaylog 成功后,主库才返回写成功到客户端。

12.Mysql 为什么要分库分表?分库分表的策略有哪些?分库分表后 id 主键如何处理?

分库分表主要是为了解决性能瓶颈和单机容量限制问题:

单表数据量过大(>千万或亿级):查询、插入、索引维护性能下降。

单库并发能力有限:MySQL 单机 QPS、连接数、I/O、CPU 都有瓶颈。

业务隔离需要:例如订单和用户分在不同库,方便扩展和维护。

数据迁移困难:如果业务增长快,早期设计的库表结构无法支撑未来数据量。

可用性需求:多库分布在不同节点,可以提高系统容错能力。

分库分表策略按照粒度分为两类:

分库策略:

按业务模块分库:如 user 库、order 库、product 库,适用于功能清晰的场景。

按数据范围分库:如按用户 ID、地域等哈希或范围映射到不同库。

分表策略:

垂直分表(列拆分):将一个表中不常用的字段或大字段(如文本/图片)拆出去。

水平分表(行拆分):将一个表的行按规则拆分成多个表。例如 order_0 ~ order_15。

分库分表后由于数据分布在多个表/库中,自增 ID 会发生冲突或失效,必须采用全局唯一 ID 策略。

常见的全局 ID 生成方案如下:

|-----------------|----------------------------------------|-----------------|
| 方案 | 描述 | 特点 |
| UUID | 使用 128 位随机 ID | 唯一但不排序,存储和查询性能差 |
| 数据库自增段 | 每个库分配不同自增起点+步长(如库1从1起,步长2,库2从2起) | 实现简单,但存在主从同步难题 |
| 雪花算法(Snowflake) | Twitter 开源,常用的 64 位 ID:时间戳 + 机器号 + 序列号 | 有序、高性能、分布式场景通用 |

13.不同数据库的区别

|-----------|----------------|------------------|----------------|------------------|
| 对比项 | MySQL | PostgreSQL | Oracle | SQL Server |
| 是否开源 | 是 | 是 | 否 | 否 |
| 事务支持 | 支持(InnoDB 引擎) | 强事务,符合 SQL 标准 | 强事务,ACID 非常健壮 | 强事务 |
| SQL 标准支持度 | 中等 | 非常高(接近 ANSI SQL) | 高,但有大量自定义扩展语法 | 高 |
| JSON 支持 | 一般(支持但功能有限) | 很强(JSONB、索引等) | 一般 | 一般 |
| 分区/分表支持 | 有限(需要手动控制) | 有 | 非常强大 | 有限 |
| 扩展能力 | 中等 | 很强(支持自定义函数、插件) | 非常强但封闭 | 较强但封闭 |
| 使用场景 | Web 系统、电商、内容平台 | 金融、GIS、数据科学、高一致性 | 企业级系统、ERP、大型项目 | 企业办公、Windows生态系统 |

14.数据库三范式

第一范式 1 NF:字段不可再分,如不会出现在一个字段里同时出现年龄和出生日期;

第二范式 2 NF:表只有唯一主键,即其他字段都只能直接或间接通过主键字段推出;

第三范式 3 NF:在 2 NF 的基础上,进一步取消间接引用。

15.MVCC

MVCC 就是多版本并发控制是 Mysql 实现读已提交和重复读的事务隔离级别的无锁机制,假如 MySql 使用行锁实现这两个隔离级别,就会造成并发事务的读阻塞,所以需要 MVCC 这个无锁机制;

MVCC 原理其实就分为两个,readView,undoLog,undoLog 就是当前数据的一个多版本链路记录,最新记录指向上一版本记录,以及记录当前数据更新执行的事务 ID;

以读已提交为例讲解 readView:

1.当前事务需要查询数据时,先根据自身事务 ID 与最新的 undolog 记录比较;

2.相等,则代表该数据的更新是事务自身修改的,所以这条记录可读;

3.否则,根据最小未提交事务 ID 判断

4.如果记录 ID 小于最小事务 ID 证明该记录已经提交,可以读;

5.否则,证明该记录是未提交事务更新的,需要回溯到上一版本记录继续判断,直到满足为止;

6.同一个事务里,每一次查询数据都执行一次 readView。

同理,重复读其实就是只在第一次读数据的时候 readView,后面的查询均使用第一次 readView 读到的数据。读未提交不需要任何处理,事务无论提交与否 sql 都执行成功,而串行实际就是表锁实现的,一个事务操作一个表,就给当前表上锁,其他事务阻塞。

相关推荐
go_bai2 分钟前
map与set的模拟实现
开发语言·c++·笔记·学习方法
饭碗、碗碗香13 分钟前
【开发常用命令】:服务器与本地之间的数据传输
linux·运维·服务器·笔记·学习
一只笨猫猫26 分钟前
MySQL中InnoDB存储引擎底层原理与MySQL日志机制深入解析
数据库·mysql
苏格拉没有底_coder41 分钟前
Redis+Kafka实现动态延时任务
数据库·redis·kafka
江畔独步1 小时前
Doris与DS结合实现MySQL侧的Upsert功能
数据仓库·mysql·doris·upsert
hymuuuu1 小时前
【源码】研学报名小程序开发功能分析案例
mysql·php·需求分析
Detachym2 小时前
CentOS7下MySQL8.0的安装到基本操作
大数据·mysql·linux学习·学习日志
键盘歌唱家2 小时前
mysql索引失效
android·数据库·mysql
电院工程师3 小时前
ChipWhisperer教程(三)
笔记·python·嵌入式硬件·安全·fpga开发·安全架构
neoooo3 小时前
🎯 深入理解:JOIN 中 ON vs WHERE 条件差异
java·后端·mysql