数据库原理
数据库
事务
事务 是数据库管理系统执行过程中的一个逻辑工作单元,它由一组SQL操作组成,这些操作要么全部成功执行(提交),要么全部不执行(回滚),以确保数据库的一致性和完整性。
事务的四大特性AICD:
- 原子性:一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败回滚
- 一致性:从一个一致状态转变为另一个一致状态
- 隔离性:多个事务并发执行时,一个事务的执行不应影响其他事务的执行
- 持久性:事务一旦提交,其对数据库的修改就是永久性的
事务需要并发控制,锁机制:共享锁/排他锁
MySQL的事务如何实现
索引
索引是数据库系统中一种特殊的数据结构,它类似于书籍的目录,能够快速定位到表中特定数据的位置,而不必扫描整个表。高频查询的列(特别是WHERE / JOIN / ORDERED BY / GROUP BY)适合简历索引。
- 有利于排序/分组:索引有序,避免额外排序
- 有利于表连接:加速匹配关联列,减少全表扫描
- 保证数据唯一性:强制唯一性约束
索引的底层实现:
- B+树:多路平衡,查找、插入、删除的时间复杂度都是O(log n)
- 哈希:查找的时间复杂度为O(1),如何处理hash冲突(开放寻址法/链表)
- LSM树:适合写多读少(适合时序数据库),分层存储,可以先写入内存,再异步刷入磁盘,查询优化(比如先查询内存,在查询磁盘)
聚簇索引和非聚簇索引的区别
聚簇索引(有且只能有一个),数据按索引键排序存储,如果定义了主键,主键就是聚簇索引
范围查询高效:由于数据按索引顺序存储,范围查询(如BETWEEN, >, <)性能优异
排序高效:查询结果自然有序,无需额外排序,减少IO:数据与索引存储在一起,减少回表操作
非聚簇索引:适合频繁查询但不常更新的列:如状态、类型等,每个表可以有多个
不影响数据物理顺序:可以创建多个不影响数据存储的索引,如果查询所需字段都在索引中,可直接从索引获取数据
缓存雪崩、击穿、穿透
数据库的数据是落在磁盘上的,磁盘的读写速度很慢
当用户的请求,都访问数据库的话,请求数量一上来,数据库很容易就奔溃
引入了缓存层,就会有缓存异常的三个问题,分别是缓存雪崩、缓存击穿、缓存穿透。
缓存雪崩:大量缓存同时过期,或者缓存故障了,就需要访问数据库,数据库压力增大
缓存击穿:某个热点数据过期,大量请求访问这个热点数据,只能从数据库中读取
这两者都是不在缓存中,在数据库中
缓存穿透是既不在缓存中,又不在数据库中