参考链接:https://javaguide.cn/database/mysql/mysql-questions-01.html
📚 数据库基础
ER图 提供实体(方块) 属性(椭圆)和联系(菱形)的方法 关系:1对1,1对多,多对多… 在创建项目之前应该先构建好数据库 并且绘制ER图来理清数据之间的关系。
数据库范式:1NF(属性不可再分),2NF(在 1NF 的基础之上,消除了非主属性对于码的部分函数依赖),3NF(在 2NF 的基础之上,消除了非主属性对于码的传递函数依赖),BCNF(在3NF的基础上 去除属性见不必要的函数依赖)
主键:唯一标识一个元组(行)不重复不为空,一个表只有一个主键
外键:与其他表建立联系 外键是另外一个表的主键 可以重复可以为空 一个表可以有多个外键
一般不推荐外键:1.增加了复杂性 2.增加了维护外键的工作量 3.对数据库分表不友好
外键的好处:1.保证数据一致性和完整性 2.级联操作简单
drop 删除表结构 turncate 清空表数据 delete使用where限定删除某一行数据/清空表数据
执行速度drop> turncate >delete
数据库设计:需求分析-ER图-ER图转为表-选取数据库和存储结构-编程测试试和运行-运行和维护
关系型数据库:如 mysql 支持事务的四大属性:ACID属性(原子性,一致性,隔离性,持久性)
非关系型数据库: 如redis 天生支持分布式,数据冗余和数据分片等特性,旨在提供可扩展的高可用高性能数据存储解决方案。非关系型数据库比较灵活,性能高,可扩展性强
字符集:GBK,ASCII,UTF8… MySQL8.0默认字符集utf8mb4
DDL数据定义语言: 定义数据库对象 CREATE、ALTER、DROP
DML数据操纵语言 : 访问数据,因此其语法都是以读写数据库为主 CRUD
DCL数据控制语言 : 控制用户的访问权限 授予权限GRANT、收回权限REVOKE
TCL事务控制语言:管理数据库中的事务 , 提交事务commit 回滚事务 rollback
索引⭐【面试被问到了】
索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构
分为:唯一索引 主键索引 聚集索引 哈希索引
https://javaguide.cn/database/mysql/mysql-index.html
sql(结构化查询语言) 语法常见面试总结可以去牛客上看 也可以刷力扣上的sql 题 这里我就不着重看了 之后刷sql题的时候再看
容易混淆的点:
| Decimal | 可以存精确的小数 |
|---|---|
| Float / Double | 只能存近似的小数 |
| DateTime | 没有时区信息 八字节存储 |
|---|---|
| TimeStamp | 和时区有关 四字节存储 |
| Null | 1.null表示缺失的值 2.任何值与null比较结果都是null 3.有些聚合函数忽略null |
|---|---|
| “ ” | 1.空字符串 2.“ ” 可以进行比较,如 “ ” = “ ”结果为true 3. 聚合函数不忽略 |
MySQL执行流程:
- 连接器(进行身份验证)
- 分析器(进行词法分析 和 语法分析)
- 优化器(按照MySQL认为最优的方案执行)
- 执行器(执行语句 从存储引擎返回数据)
- **存储引擎⭐(InnoDB、MyISAM、Memory 等多种存储引擎。InnoDB 是 MySQL 的默认存储引擎,只有InnoDB支持事务)
存储引擎采用插件式架构 ,基于表结构而不是数据库
MySQL 日志⭐
常见的日志分类:错误日志,查询日志,慢查询日志(可以结合 EXPLAIN 分析查询执行计划,优化索引或 SQL 结构,可用于性能优化),二进制日志(主从复制),回滚日志,重做日志(保证事务的持久性)…
MySQL事务:逻辑上的一组操作要么都执行要么都不执行。事务分为扁平事务(最简单的情况),嵌套事务,分布式事务… 事务的四大属性ACID. 事务的目的就是为了保证数据的一致性。
并发事务带来的问题:脏读,不可重复读,幻读,丢失修改(四种问题基本概念是什么?如何解决?)
并发事务的控制方式:
- 锁,通过读写锁来显式控制共享资源 分为表级锁(对整表加的锁)和行级锁(对索引字段加的锁),MyISAM 仅仅支持表级锁,InnoDB两者均支持。无论是表级锁和行级锁都存在共享锁S和排他锁X。意向锁可以来快速判断是否可以对某个表使用表锁,从而有了意向共享锁IS和意向排他锁IX
- MVCC(多版本并发控制)即对一份数据会存储多个版本,通过事务的可见性来保证事务能看到自己应该看到的版本。
事务隔离级别(级别越高,数据一致性越好,但并发性能可能越低):1.读未提交 2.读已提交 3.可重复读(MySQL默认的隔离级别) 4.可串行化。 MySQL 的隔离级别基于锁和 MVCC 机制共同实现的
当前读和快照读
当前读 = 当前最新数据 + 会加锁 → “最新、可能被阻塞”
快照读 = 事务快照 + 不加锁 → “旧版本、不会被阻塞”
MySQL调优⭐
MySQL可以存文件(文件转为二进制文件存入MySQL),但是影响数据库性能占用太多存储空间。可以用云服务厂商提供的对象存储如OSS…也可以用MinIO开源项目实习分布式文件服务。
https://www.51cto.com/article/716978.html
MySQL性能优化:慢查询日志找 SQL → Explain 看执行计划(分析性能) → 索引优化/表结构优化… → 锁和 IO 分析 → SQL 重写 → 测试验证
读写分离:读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上。 这样的话,就能够小幅提升写性能,大幅提升读性能。
如何实现:主数据库和从数据库数据实时同步(主从复制),写请求交给主数据库处理,读数据库交给从数据库处理。
主从复制:主数据库的数据变化写入二进制日志,从库链接主库,主库创建I/O线程发送二进制日志给从库,从库将二进制日志写入中继日志(Relay log)然后从库的sql线程读取中继日志实现主从数据实时同步(可能会发生主从同步延迟)
第一种实现方式:代理方式
在应用和数据中间加了一个代理层。应用程序所有的数据请求都交给代理层处理,代理层负责分离读写请求,将它们路由到对应的数据库中。
第二种实现方式:组件方式
引入第三方组件来帮助我们读写请求。
分库分表:如果一张表的存储数据量太大就要分库分表。分库分为水平分库(按照数据划分,行划分)和垂直分库(按照业务划分,属性划分)分表与分库同理。分库分表之后需要解决事务问题,分布式id问题,join操作问题
冷热数据:热数据是指经常被访问和修改且需要快速访问的数据,冷数据是指不经常访问,对当前项目价值较低,但需要长期保存的数据。可以按照时间和访问频率划分。
延时双删⭐【面试被问到了】(保证数据一致性):首先删除redis中的缓存数据,然后更新数据库中的数据,让当前线程休眠一段时间,唤醒之后再次删除redis的缓存数据。
2025.10.19
MySQL高性能优化规范建议总结(了解即可)
数据库命名要规范 所有表使用InnooDB存储引擎 数据库和表的字符集统一使用utf8 单个表的数据量大小尽量在500万之内,再大可以考虑分库分表。对于日期类型用Datatime或timestamp 不要用字符串存储。可以通过查询MySQL的慢查询日志发现需要进行优化的sql语句。对于超100万行的批量操作(插入,更新,删除)要分批多次进行操作,因为大批量操作可能会造成主从延迟。
重点【重新看一下】
索引:索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。常见的索引结构:B-Tree索引、B+树索引、Hash索引、红黑树索引… InnoDB和MyISAM都选择B+树作为索引结构. 索引的优缺点:
优点:1.查询速度快减少磁盘I/O次数 2.保证数据的一致性(唯一索引)3.可以加快排序和分组
缺点:创建和维护耗时,占用存储空间,当数据量太小的时候全表扫描速度会比索引快。
索引: 1.按照数据结构分类:B-Tree索引、B+树索引、Hash索引、红黑树索引… 2.按照底层存储方式分类:聚集索引和非聚集索引 3.应用维度分类:主键索引,唯一索引,普通索引,覆盖索引
B数和B+树的区别:1. B树的每个节点都存了key和data,B+树的data只存在叶子节点。非叶子节点仅存在key,可以让B+树更低,磁盘I/O操作次数更少。2. B+树所有叶子构成有序链表按照主键排序遍历全部记录 支持范围查找。
主键索引:一个表只有一个主键索引,主键索引不能为null,不能重复。如果设计表的时候没有符合的字段(唯一且不为null),InnoDB会自动创建一个自增字段作为主键索引。
EXPLAIN 分析执行计划 通过查询优化器对语句进行分析 找出最优的查询方法 并显示对应的信息
MySQL三大日志:
- 二进制日志(Binary log):记录了所有对数据库的DDL和DML操作。可以用于数据备份,主从复制