31.题目:说一下 ACID 是什么?
原子性(Atomicity):事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用。
一致性(Consistency):执行事务前后,数据保持一致,多个事名对同一个数据读取的结果是相同的。
隔离性(Isolation):并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的。
持久性(Durability):一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
32.题目:说一下数据库的事务隔离?
MySQL的事务隔离是在MySQL.ini配置文件里添加的,在文件的最后添加:transaction-isolation = REPEATABLE-READ
可用的配置值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE- READ、SERIALIZABLE。
READ-UNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读)。
READ-COMMITTED:提交读,一个事务提交后才能被其他事务读取到(会
造成幻读、不可重复读)。
REPEATABLE-READ:可重复读,默认级别,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读)。
SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。
脏读:表示一个事务能够读取另一个事务中还未提交的数据。如,某个事务尝试插入记录 A,此时该事务还未提交,然后另一个事务尝试读取到了记录
不可重复读:是指在一个事务内,多次读同一数据。
幻读:指同一个事务内多次查询返回的结果集不一样。比如同一个事务 A第一次查询时候有 n 条记录,但是第二次同等条件下查询却有 n+1 条记录,这就好像产生了幻觉。发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。
33.题目:视图的优缺点?
优点:
对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。
用户通过简单的查询可以从复杂查询中得到结果。
维护数据的独立性,试图可从多个表检索数据。
对于相同的数据可产生不同的视图。
缺点:
性能:查询视图时,必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么就无法更改数据。
非关系型数据库的优势:
性能:NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过 SQL 层的解析,所以性能非常高。
可扩展性:同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。
34.题目:InnoDB为什么要使用B+树,而不是B树、Hash、红黑树或二叉树?
因为B树、Hash、红黑树或二叉树存在以下问题:
B树:不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保存大量数据,只能增加树的高度,导致IO操作变多,查询性能变低。
Hash:虽然可以快速定位,但是没有顺序,IO复杂度高。
二叉树:树的高度不均匀,不能自平衡,查找效率跟数据有关(树的高度),并且 IO代价高。
红黑树:树的高度随着数据量增加而增加,IO 代价高。
35.题目:说一下 MySQL 的行锁和表锁?
MyISAM只支持表锁,InnoDB支持表锁和行锁,默认为行锁。
>表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低。
>行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高。
36.题目:什么是表分区?
表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成
37.题目:MySQL 如何实现高可用?
MySQL 实现高可用的步骤如下:
尝试避免导致宕机的原因来减少宕机时间;比如通过适当配置、监控以及规范和安全的保障措施来避免人为错误。
尽量保证发生宕机时能够快速恢复。常见策略是在系统中制造冗余,并且具备故障转移能力。
38.题目:说一下乐观锁和悲观锁?
乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。
悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。
数据库的乐观锁需要自己实现,在表里面添加一个version 字段,每次修改成功值加 1,这样每次修改的时候先对比一下,自己拥有的 version 和数据库现在的 version 是否一致,如果不一致就不修改,这样就实现了乐观锁。
39.题目:如何做故障转移和恢复?
故障转移和恢复的策略如下:
提升一台备库作为主库,或者在主-主复制结构中调换主动与被动的角色。
为提供特定服务的 MySQL 实例指定一个逻辑 IP 地址,当该实例失效时,可以将该 IP 分配给另一台MySQL 服务器。
可以使用代理、端口转发、网络地址转换(NAT)或者硬件负载均衡来实现故障转移和恢复。
将监控机制构建到应用,处理故障转移会更加灵活和简单。因为遇到错误时,外部观察者正常情况下是无法觉察的。此时,应用立刻开始故障转移并管理用户体验。比如提供降级功能,并显示给用户合适的信息。
40.题目:数据库建立索引常用的原则是什么?
在大数据量的表上建立索引才有意义。
在 where 子句或是连接条件上经常引用的列上建立索引。
很少或从不引用的字段和逻辑型的字段,如男或女(是或否)等不要建立索引。