数据库面试(2)

合同管理系统数据库分析

表的建立

我们创建7个数据库基本表:项目注册表、承包合同登记表、承包合同结算表、承包合同变更及索赔表、分包合同登记表、分包合同结算表以及用户表。

在这里插入图片描述
在这里插入图片描述

常用三范式

第一范式:原子性,列不可分。
在这里插入图片描述
第二范式:有主键,保证完全依赖
在这里插入图片描述
有主键学号,姓名(两个),其他属性被唯一确定
对应上述就是登记表与结算表有主键
如果一个表有依赖于两个主键的元素,有依赖与一个主键的元素则不符合2nf
第三范式:无传递依赖:任何元素不依赖非主键,没有传递依赖

数据库索引

索引方便数据库查询,更新。用了B+数,他不会去搜索一个整表,只会访问叶子节点指针,存储引擎会根据指针寻找数据(logn)
B+Tree : InnoDB存储引擎的索引实现,叶子节点带指针,非叶子不会,叶子节点由于指针相互连接

文件索引和数据库索引为什么使用B+树?
这些文件较大,需要存在硬盘

索引的优点
1.大大加快数据的检索速度,这也是创建索引的最主要的原因;
2.加速表和表之间的连接;
3.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间;
4.通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性;

什么情况下设置了索引但无法使用?
1.以“%(表示任意0个或多个字符)”开头的LIKE语句,模糊匹配;
2.OR语句前后没有同时使用索引;
3.数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型);
4.对于多列索引,必须满足 最左匹配原则 (eg:多列索引col1、col2和col3,则 索引生效的情形包括 col1或col1,col2或col1,col2,col3)。

什么样的字段适合创建索引?
1.经常作查询选择的字段
2.经常作表连接的字段
3.经常出现在order by, group by, distinct 后面的字段

创建索引时需要注意什么?
1.非空字段:应该指定列为NOT NULL,除非你想存储NULL。在mysql中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值;
2.取值离散大的字段:(变量各个取值之间的差异程度)的列放到联合索引的前面,可以通过count()函数查看字段的差异值,返回值越大说明字段的唯一值越多字段的离散程度高;
3.索引字段越小越好:数据库的数据存储以页为单位一页存储的数据越多一次IO操作获取的数据越大效率越高。

索引的缺点
1.时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度;
2.空间方面:索引需要占物理空间。

索引的分类
1.普通索引和唯一性索引:索引列的值的唯一性
2.单个索引和复合索引:索引列所包含的列数
3.聚簇索引与非聚簇索引:聚簇索引按照数据的物理存储进行划分的。对于一堆记录来说,使用聚集索引就是对这堆记录进行堆划分,即主要描述的是物理上的存储。正是因为这种划分方法,导致聚簇索引必须是唯一的。聚集索引可以帮助把很大的范围,迅速减小范围。但是查找该记录,就要从这个小范围中Scan了;而非聚集索引是把一个很大的范围,转换成一个小的地图,然后你需要在这个小地图中找你要寻找的信息的位置,最后通过这个位置,再去找你所需要的记录。

主键、自增主键、主键索引与唯一索引概念区别

1.主键:指字段 唯一、不为空值 的列;
2.主键索引:指的就是主键,主键是索引的一种,是唯一索引的特殊类型。创建主键的时候,数据库默认会为主键创建一个唯一索引;
3.自增主键:字段类型为数字、自增、并且是主键;
4.唯一索引:索引列的值必须唯一,但允许有空值。主键是唯一索引,这样说没错;但反过来说,唯一索引也是主键就错误了,因为唯一索引允许空值,主键不允许有空值,所以不能说唯一索引也是主键。

主键是一种特殊的唯一性索引,其可以是聚集索引,也可以是非聚集索引。

事务

事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。

原子性(Atomicity):事务所包含的一系列数据库操作要么全部成功执行,要么全部回滚;

一致性(Consistency):事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态;

隔离性(Isolation):并发执行的事务之间不能相互影响;

持久性(Durability):事务一旦提交,对数据库中数据的改变是永久性的。

脏读:一个事务读取了另一个事务未提交的数据;

不可重复读:不可重复读的重点是修改,同样条件下两次读取结果不同,也就是说,被读取的数据可以被其它事务修改;

幻读:幻读的重点在于新增或者删除,同样条件下两次读出来的记录数不一样。

隔离级别决定了一个session中的事务可能对另一个session中的事务的影响。ANSI标准定义了4个隔离级别,MySQL的InnoDB都支持,分别是:

READ UNCOMMITTED:最低级别的隔离,通常又称为dirty read,它允许一个事务读取另一个事务还没commit的数据,这样可能会提高性能,但是会导致脏读问题;

READ COMMITTED:在一个事务中只允许对其它事务已经commit的记录可见,该隔离级别不能避免不可重复读问题;

REPEATABLE READ:在一个事务开始后,其他事务对数据库的修改在本事务中不可见,直到本事务commit或rollback。但是,其他事务的insert/delete操作对该事务是可见的,也就是说,该隔离级别并不能避免幻读问题。在一个事务中重复select的结果一样,除非本事务中update数据库。

SERIALIZABLE:最高级别的隔离,只允许事务串行执行。

MySQL默认的隔离级别是REPEATABLE READ。

mysql的事务支持

MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关:

MyISAM:不支持事务,用于只读程序提高性能;
InnoDB:支持ACID事务、行级锁、并发;
Berkeley DB:支持事务。

  • https://blog.csdn.net/si444555666777/article/details/82111355
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值