每日一考-9.14

数据库三范式是什么

第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。如地址中湖北省武汉市洪山区就应该拆分成三列。

第二范式: 在第一范式基础上,规定表中非主键列不存在对逐渐的部分依赖。即要求每个表只描述一件事情,如在订单表中,如果有订单编号,产品编号,订购日期,产品价格,就应该拆分为两个表,分别为订单表和产品表。

第三范式:满足第一二范式,并且表中的列不存在对于非主键列的传递依赖,即表中有订单编号,订购日期,顾客编号,顾客姓名,此时顾客姓名依赖于非主键的顾客编号,应该去掉顾客编号。

说⼀下 ACID 是什么

分别是Atomicity(原⼦性),Consistency(⼀致性),Isolation(隔离性),Durability(持久性)

原子性:一个事务中,所有操作要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被(Rollback)回滚到事务开始前的状态,就像这个事务从来没执行过一样,如银行转账中止。事务不可分割,不可约简。

一致性:事务在开始之前和事务结束以后,数据库的的完整性没有被破环,这表示写入的资料必须完全符合所以的预设约束,触发器,计量回滚等。简答的说就是一个事务执行完毕(无论是否正常执行完毕)数据库必须处于一致状态。

隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据不一致。

持久性:事务处理结束后,对数据的修改就是永久的,即使系统故障也不会丢失。即持久化存在于硬盘中。

mysql 索引是怎么实现的

具体来说 MySQL 中的索引,不同的数据引擎实现有所不同,但⽬前主流的数据库引擎的索引都是 B+树实现的,B+ 树的搜索效率,可以到达⼆分法的性能,找到数据区域之后就找到了完整的数据结构了,所有索引的性能也是更好的

MySQL 中有哪几种🔒?

5.0以前,使用MyISAM存储引擎时,Mysql只支持表级🔒

在5.0版本后,默认存储引擎为InnoDB,支持页面🔒,表级🔒,行级🔒

1、表级锁: 开销小, 加锁快; 不会出现死锁; 锁定粒度大, 发生锁冲突的概率最高,并发度最低。**
2、行级锁: 开销大, 加锁慢; 会出现死锁; 锁定粒度最小, 发生锁冲突的概率最低,并发度也最高。
**3、页面锁: 开销和加锁时间界于表锁和行锁之间; 会出现死锁; 锁定粒度界于表锁和行锁之间, 并发度一般。

执行select * from user where id = 1时发生了什么

![](file://C:/Users/Administrator/Desktop/%E9%9D%A2%E8%AF%95/%E9%9D%A2%E8%AF%95/img/image-20210902082718756.png?lastModify=1663160573)

  1. 连接器:负责建立连接、检查权限、连接超时时间由 wait_timeout 控制,默认 8 小时
  2. 查询缓存:会将 SQL 和查询结果以键值对方式进行缓存,修改操作会以表单位导致缓存失效
  3. 分析器:词法、语法分析
  4. 优化器:决定用哪个索引,决定表的连接顺序等
  5. 执行器:根据存储引擎类型,调用存储引擎接口
  6. 存储引擎:数据的读写接口,索引、表都在此层实现

数据库三范式是什么

第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。如地址中湖北省武汉市洪山区就应该拆分成三列。

第二范式: 在第一范式基础上,规定表中非主键列不存在对逐渐的部分依赖。即要求每个表只描述一件事情,如在订单表中,如果有订单编号,产品编号,订购日期,产品价格,就应该拆分为两个表,分别为订单表和产品表。

第三范式:满足第一二范式,并且表中的列不存在对于非主键列的传递依赖,即表中有订单编号,订购日期,顾客编号,顾客姓名,此时顾客姓名依赖于非主键的顾客编号,应该去掉顾客编号。

说⼀下 ACID 是什么

分别是Atomicity(原⼦性),Consistency(⼀致性),Isolation(隔离性),Durability(持久性)

原子性:一个事务中,所有操作要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被(Rollback)回滚到事务开始前的状态,就像这个事务从来没执行过一样,如银行转账中止。事务不可分割,不可约简。

一致性:事务在开始之前和事务结束以后,数据库的的完整性没有被破环,这表示写入的资料必须完全符合所以的预设约束,触发器,计量回滚等。简答的说就是一个事务执行完毕(无论是否正常执行完毕)数据库必须处于一致状态。

隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据不一致。

持久性:事务处理结束后,对数据的修改就是永久的,即使系统故障也不会丢失。即持久化存在于硬盘中。

mysql 索引是怎么实现的

具体来说 MySQL 中的索引,不同的数据引擎实现有所不同,但⽬前主流的数据库引擎的索引都是 B+树实现的,B+ 树的搜索效率,可以到达⼆分法的性能,找到数据区域之后就找到了完整的数据结构了,所有索引的性能也是更好的

MySQL 中有哪几种🔒?

5.0以前,使用MyISAM存储引擎时,Mysql只支持表级🔒

在5.0版本后,默认存储引擎为InnoDB,支持页面🔒,表级🔒,行级🔒

1、表级锁: 开销小, 加锁快; 不会出现死锁; 锁定粒度大, 发生锁冲突的概率最高,并发度最低。**
2、行级锁: 开销大, 加锁慢; 会出现死锁; 锁定粒度最小, 发生锁冲突的概率最低,并发度也最高。
**3、页面锁: 开销和加锁时间界于表锁和行锁之间; 会出现死锁; 锁定粒度界于表锁和行锁之间, 并发度一般。

执行select * from user where id = 1时发生了什么

![](file://C:/Users/Administrator/Desktop/%E9%9D%A2%E8%AF%95/%E9%9D%A2%E8%AF%95/img/image-20210902082718756.png?lastModify=1663160573)

  1. 连接器:负责建立连接、检查权限、连接超时时间由 wait_timeout 控制,默认 8 小时
  2. 查询缓存:会将 SQL 和查询结果以键值对方式进行缓存,修改操作会以表单位导致缓存失效
  3. 分析器:词法、语法分析
  4. 优化器:决定用哪个索引,决定表的连接顺序等
  5. 执行器:根据存储引擎类型,调用存储引擎接口
  6. 存储引擎:数据的读写接口,索引、表都在此层实现

事务隔离级别

未提交读
问题:脏读:读出的数据无效(可能是其他事务修改后未提交的数据)
解决方案:提高隔离级别

RC提交读(支持行🔒)
问题:不可重复读:两次读出的数据不一致(两次操作中间,其他线程执行了修改)
解决方案:提高隔离级别

RR可重复读(mysql的默认级别,底层通过快照读能保证同一事务内多次查询数据一致)
问题:幻读:读后进行插入操作,可能主键冲突(两次操作中,其他线程进行了新增操作)
解决方案:加锁避免:for update(间隙🔒),其他线程执行新增时,会被间隙锁阻塞,然后该线程出现主键冲突。
提高隔离级别(其实是加了共享读🔒)

串行读(影响性能,基本不用)
无错误现象,读写都会阻塞其他事务,可以保证更强的一致性。

posted @   别亦难  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示