那些必须掌握的数据库面试题

1.数据库的四大特性(ACID)

原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性指事务前后数据的完整性必须保持一致。
隔离性指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离。
持久性是指一个事务一旦提交,它对数据库中数据的改变就是永久性的,即便数据库发生故障也不应该对其有任何影响。

2.数据库的三大范式

第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。
第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。在1NF基础上,任何非主属性不依赖于其它非主属性[在2NF基础上消除传递依赖]。
第三范式(3NF):第三范式是第二范式的一个子集,即满足第三范式必须满足第二范式。 首先是 第二范式,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。

3. MySql四种隔离级别

未提交读(Read Uncommitted):其他事务可以看到本事务没有提交的部分修改,因此会造成脏读问题。。
提交读(Read Committed):其他事务只能读取到本事务已经提交的部分,这个隔离解绑有不可重复读的问题,在同一个事务内的两次读取,拿到的结果可能不一样,因为另外一个事务对数据进行了修改。。
可重复读(Repeated Read):该隔离级别消除了不可重复读,但是还存在幻读问题,当你读取id>10的数据行是,对涉及到的行加上了读锁,此时另外的一个事务新插入了一条数据id=11的数据,因为是新插入的,所以不会触发上面的锁的排斥。那么进行本事务的下一次的查询时会发现有一条id=11的数据,而上次查询操作并没有获取到。该隔离是InnoDB默认级别。
可串行读(Serializable):最高的隔离级别,可以解决上面提到的所有问题,因为它强制所有的操作串行执行,这会导致每次读都需要获得表级共享锁,读写相互都会阻塞。

4. mysql的引擎用的哪一种?

MySql的默认存储引擎是InnoDB,此外,MySql支持多种存储引擎,比如MyISAM,Memory,Archive等。

5. InnoDB与MyISAM的区别

InnoDBMyISAM
支持事务不支持
支持行级锁不支持
支持外键不支持
不支持全文索引支持
支持MVCC不支持

6. MySQL中char、varchar、text的区别

数据的检索效率是:char > varchar > text
经常变化的字段用varchar;
知道固定长度的用char;
超过255字节的只能用varchar或者text;
能用varchar的地方不用text;

  1. mysql的主从复制?

MySQL主从复制是其最重要的功能之一。
主从复制是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中。对于多级复制,数据库服务器即可充当主机,也可充当从机。
MySQL主从复制的基础是主服务器对数据库修改记录二进制日志,从服务器通过主服务器的二进制日志自动执行更新。
MySQL主从复制的两种情况:同步复制和异步复制,实际复制架构中大部分为异步复制。

8.数据库乐观锁和悲观锁

悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。
> 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
Java synchronized 就属于悲观锁的一种实现,每次线程要修改数据时都先获得锁,保证同一时刻只有一个线程能操作数据,其他线程则会被block。
乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。
乐观锁适用于读多写少的应用场景,这样可以提高吞吐量。
> 乐观锁:假设不发生并发冲突,只在提交操作时检查是否违反数据完整性。
乐观锁一般来说有以下2种方式:
使用数据版本(Version)记录机制实现,\即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据。
使用时间戳(timestamp)。乐观锁定的第二种实现方式和第一种差不多,同样是在需要乐观锁控制的table中增加一个字段,名称无所谓,字段类型使用时间戳(timestamp), 和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突。

9. 共享锁与排他锁

共享锁: 又叫做读锁,当用户要进行数据的读取时,对数据加上共享锁,共享锁可以同时加上多个。
排他锁: 又叫做写锁,当用户要进行数据的写入时,对数据加上排它锁,排它锁值可以加一个,他和其他的排它锁,共享锁都互斥。

10.什么是索引

MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在mysql中使用较多的索引有Hash索引,B+树索引等。而我们经常使用的InnoDB存储引擎的默认索引实现是:B+树索引。。

11.关于索引的优缺点

优势:提高数据检索的效率,降低数据库的IO成本。通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。
劣势:实际上索引也是一张表,该表中保存了主键与索引字段,并指向实体类的记录,所以索引列也是要占用空间的。 虽然索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT、UPDATE、DELETE。因为更新表时,MySQL 不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息。

12. 关于索引失效

1.使用不等查询
2.列参与了数***算或者函数
3.字符串like时最左边是通配符:"%aaa"
4.当mysql分析全表扫描比使用索引快时不使用索引
5.当使用联合索引时,前面一个条件为范围查询,后面的即使是符合最左前缀原则也不使用索引。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值