锁、事务、索引

一、事物和锁

1.1锁按类型分几类

共享锁:又叫读锁,当用户进行读取数据时,对数据可以加上多个共享锁

排他锁:又叫写锁,当用户进行数据的写入时,只能加一个排他锁(否则会发生排斥)

意向共享锁:一个事务在获取(任何一行/或者全表)S锁之前,一定会先在所在的表上加IS锁。

意向排他锁:一个事务在获取(任何一行/或者全表)X锁之前,一定会先在所在的表上加IX锁。

1.2锁按粒度分为几类

行锁:锁一行

表锁:锁一张表

页锁:锁一整页

1.3行锁按算法分几类

Record Locks:简单翻译为行锁吧。行锁最终都会落到聚簇索引上!

Gap Locks:简单翻译为间隙锁,是对索引的间隙加锁,其目的只有一个,防止其他事物插入数据

Next-Key Locks:简单翻译为临键锁

1.4.行锁锁住是是什么? (数据还是索引) ----索引

1.5.什么时候会发生锁冲突 (即锁等待, 通过共享锁排他锁能否在同意资源上共存关系来回答)

  • 共享锁和共享锁可以共存
  • 共享锁和排它锁不能共存
  • 排它锁和排他锁不能共存

1.6.什么是死锁? 解决死锁的方式

*死锁:当两个或i两个以上的事物在同一资源上互相被占用,此时再去访问对方的资源,从而导致的恶心循环的现象

* 解决死锁的方法:1提升锁的粒度 2以相同的顺序去访问3.将所需要的业务全部加锁

1.7.什么是事务?

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

2.事务使逻辑上的一种操作,要么都执行,要么都不执行

3.事物就是保证两个关键的操作要么都成功,要么都不成功

1.8.什么是事务的四大特性

1.原子性(Atomicity):

事务是最小的执行单位,不允许分割

事务的原子性是确保动作要么全部完成,要么完全不起作用

2.一致性(Consistency)

执行事务后数据保持一致,多个事务对同一事物的读取结果使相同的

3.隔离性(Isolation)

并发访问数据库时,一个用户的事务不能被其他事务所干扰,各并发事务之间数据库是独立的

4.持久性(Durability)

一个事务被提交之后,他对数据库中数据的改变是持久的,即使数据库发生故障,也不会造成影响

1.9.事务的隔离级别有几种, 分别是什么?

① read uncommited(读取未提交内容) :在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。读取未提交的数据,也被称之为脏读(Dirty Read)

② read committed(读取提交内容):这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。可解决脏读

③ repeatable read(可重读):这是MySQL的默认事务隔离级别,同一事务的多个实例在并发读取数据时,会看到同样的数据。不过理论上,这会导致另一个棘手的问题:幻读(Phantom Read)。可解决脏读、不可重复读

④ serializable (可串行化 ) :这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。可解决脏读、不可重复读、幻读。

1.10什么是当前读和快照读

快照读 (不加锁)--快照读基于undolog日志和MVCC多版本并发控制程序实现

执行的是快照读,读的是数据库记录的快照版本,是不加锁的

当前读 (加锁, 可以是共享锁, 也可以是排他锁)---当前读基于临键锁实现

加的是表锁还是行锁呢?---其实都不是, 而是一种临键锁 (行锁+间隙锁)

1.11.什么是脏读? 如何解决?

脏读:当T1事物读取T2不知是否已经提交的事务时,如果T2事务提交,不会出错,但是未提交,会发生回滚,从而产生脏读

解决的办法:可以使用读已提交的隔离级别解决

1.12.什么是不可重复度? 如何解决

不可重复读:就是事务T1在刚开始是读取数据为a,但在某一时间段被事务T2将这一数据改为了b,则事务T1此时读取的就是b

解话的办法:1.使用mysql默认的隔离级别2.读取之前加入一个共享行锁

1.13.什么是幻读? 如何解决

幻读:事务T1还没有结束期间,两次读取数据,读取到的行数不一致,即在T1两次读取期间,数据因为其他事务的插入和删除而变多或者变少了

解决的办法:该隔离级别开始前加入间隙锁,一定程度上避免了幻读的产生

二、索引

什么是索引?

索引就相当于目录,可以快速的查账数据

索引是一个特殊的文件,它包含数据表里所有记录的引用指针,他是一种数据结构,占据一定的物理空间。

2.索引有哪些优缺点?索引的优点

索引优点?

       可以大大加快数据检索速度,通过索引可以再查询工程中提高系统的性能

索引的缺点?

     时间方面:给字段添加索引或者维护索引时耗费时间,对表进行增删改的时候降低执行的速率

     空间方面:占据一定的物理空间

3.索引有哪些类型?

  • 主键索引
  • 唯一索引
  • 覆盖索引--组合索引
  • 全文索引

4.聚簇索引和非聚簇索引区别?

聚簇索引的叶子节点为磁盘上的真实数据。非聚簇索引的叶子节点还是索引,指向聚簇索引B+树

  • 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据
  • 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,在内存中直接搜索索引,然后通过索引找到磁盘相应数据,速度慢

5.B+树索引和Hash索引的区别?

1、一般情况下hash索引进行等值查询更快,但是却无法进行范围查询---性能不可预测

2、hash索引不支持使用索引进行排序,原理同上

3、hash索引任何时候都避免不了回表查询数据

B+树在符合某些条件(聚簇索引、覆盖索引)的时候可以只通过索引完成查询

4、hash索引不支持模糊查询以及多列索引的最左前缀匹配。

6.B树和B+树索引的区别?

B树:B树中同一键值不会出现多次,并且它有可能出现在叶结点,也有可能出现在非叶结点中。

B+树的键一定会出现在叶结点中,并且有可能在非叶结点中也有可能重复出现,以维持B+树的平衡。

B+树在插入的时候通过增加冗余节点,实现所有的数据绑定在树的最底层,这样在加载上层的树的节点进行查找的时候,加载的速度比B树的加载速度要快

B树只适合随机检索,而B+树同时支持随机检索和顺序检索

B+树曾删文件时空间利用率更高,可减少I/O次数,磁盘读写代价更低

7.什么是回表查询?  

索引中只有该索引字段和主键字段,而查询的字段中包含了其他额外的字段,那会就会拿着id回到主键索引中查询

8.非聚簇索引一定会回表查询吗?

不一定,这涉及到查询语句所要求的字段是否全部应用了索引,如果全部应用了索引,那么就不必再进行回表查询

9.如何防止回表查询?

1.直接用主键id作为条件在主键索引中进行查询即可,因为主键索引上绑定的是整行数据

2.如果一定要查name,age,job这样的字段,又不用id作为条件

select id,name,age,job from emp where name=""and age=""and job="";

请使用组合索引,也称为覆盖索引

10.什么是索引的最左前缀原则?

就是最左优先,在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边

第三部分 - 多表查询

1.什么是笛卡尔积?

  •  两张表中每一行数据交叉连接后得到的数据集合

2.什么是数据库三范式?

  • 第一范式:字段具有原子性,不可再分割

每一个字段只描述一个信息

  • 第二范式:表要有主键

区分每一条记录不重复,记录具有唯一性

  • 第三范式:每一个字段都直接依赖主键

不直接依赖主键的字段,拆分到另一张表,提供一个关联字段进行推理

3.数据库表关系有几种? 分别是什么

  • 一对一:一张表,分成两张表,分别存储重要字段和非重要字段,其中一张表是另一张表信息的补充
  • 一对多:一张表,分成两张表,具有主从关系,表示一的称为主表,表示多的称为从表
  • 多对多

4.内连接和外连接的区别?

  • 内连接: 只有两个表相匹配的行才能在结果集中出现,舍弃了不匹配的数据
    • 不满足on条件的不会出现在结果集中(不满足全部去除)
  • 外连接: 外连接不仅包含符合连接条件的行,还包含左表(左连接时)、右表(右连接时)或两个边接表(全外连接)中的所有数据行
    • 不满足条件的字段会在结果集中至少出现一次,其余的用null填充

5.左外连接和右外连接的区别?

左连接:返回包括左表中的所有记录和右表中连接字段相等的记录。如果左表的某行在右表中没有匹配行,则将为右表返回空值。 

 右连接:返回包括右表中的所有记录和左表中连接字段相等的记录。如果右表的某行在左表中没有匹配行,则将为左表返回空值

6.什么是自连接?

  • 无限分类,同一张表产生主外键关系

7.什么是集合查询

  • 对两个查询或多个查询进行并集,交集,差集

第四部分 - 其他

1.varchar 和 char的区别

一、长度不同

1、char类型: char类型的长度是固定的。

2、 varchar类型: varchar类型的长度是可变的。

二、效率不同

1、char类型: char类型每次修改的数据长度相同,效率更高。

2、varchar类型:varchar类型每次修改的数据长度不同,效率更低。

2.varchar(32) 括号中的32是什么? 能不能不写 (32) ? 如果不写默认是什么

varchar(32) 数据存储的大小 255

3.int(10) 括号中的10是什么? 能不能不写int(10),如果不写默认是什么?

数据的长度

4.drop、delete、truncate的区别

答:drop 删除表的结构/权限 不可回滚

delete 删除表中的数据内容或一行内容 可回滚

truncate 删除表,但不删除表的结构 不可回滚

4.浮点数类型float和double有什么问题? 你会怎么处理?

默认是double

在每次后加入F/f 就是float

5.什么是格林尼治标准时间, 如何获取当前系统时间

system.million

若有收获,就点个赞吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值