文章目录
mysql学习-day05 事务
MySQL常见面试题
1.什么是索引
索引是一种数据结构,可以帮助我们快速的进行数据的查找.
2.索引是个什么样的数据结构呢?
索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有
Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现
为:B+树索引.
3. Hash索引和B+树所有有什么区别或者说优劣呢?
Hash索引和B+树所有有什么区别或者说优劣呢?
hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据.B+树底层实现是多路平衡查找树.对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据.
- hash索引进行等值查询更快(一般情况下),但是却无法进行范围查询.
4. 什么是聚簇索引?
在B+树的索引中,叶子节点可能存储了当前的key值,也可能存储了当前的key
值以及整行的数据,这就是聚簇索引和非聚簇索引. 在InnoDB中,只有主键索
引是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引.如果没有唯一
键,则隐式的生成一个键来建立聚簇索引.
当查询使用聚簇索引时,在对应的叶子节点,可以获取到整行数据,因此不用再
次进行回表查询.
5. ACID
A=Atomicity
原子性,就是上面说的,要么全部成功,要么全部失败.不可能只执行一部分操作.
C=Consistency
系统(数据库)总是从一个一致性的状态转移到另一个一致性的状态,不会存在中
间状态.
I=Isolation
隔离性: 通常来说:一个事务在完全提交之前,对其他事务是不可见的.注意前面
的通常来说加了红色,意味着有例外情况.
D=Durability
持久性,一旦事务提交,那么就永远是这样子了,哪怕系统崩溃也不会影响到这个
事务的结果.
6. 事务隔离级别
MySQL的四种隔离级别如下:
- 未提交读(READ UNCOMMITTED)
这个隔离级别下,其他事务可以看到本事务没有提交的部分修改.因此会造成脏
读的问题(读取到了其他事务未提交的部分,而之后该事务进行了回滚).
这个级别的性能没有足够大的优势,但是又有很多的问题,因此很少使用.
- 已提交读(READ COMMITTED)
其他事务只能读取到本事务已经提交的部分.这个隔离级别有不可重复读的问
题,在同一个事务内的两次读取,拿到的结果竟然不一样,因为另外一个事务对数
据进行了修改.
- REPEATABLE READ(可重复读)
可重复读隔离级别解决了上面不可重复读的问题(看名字也知道),但是仍然有一
个新问题,就是 幻读,当你读取id> 10 的数据行时,对涉及到的所有行加上了
读锁,此时例外一个事务新插入了一条id=11的数据,因为是新插入的,所以不会
触发上面的锁的排斥,那么进行本事务进行下一次的查询时会发现有一条id=11
的数据,而上次的查询操作并没有获取到,再进行插入就会有主键冲突的问题.
- SERIALIZABLE(可串行化)
这是最高的隔离级别,可以解决上面提到的所有问题,因为他强制将所以的操作
串行执行,这会导致并发性能极速下降,因此也不是很常用.
InnoDB默认使用的是可重复读隔离级别.
7. MySQL支持哪些存储引擎?
MySQL支持多种存储引擎,比如InnoDB,MyISAM,Memory,Archive等等.在大多数的情况下,直接选择使用InnoDB引擎都是最合适的,InnoDB也是MySQL的默认存储引擎.
InnoDB和MyISAM有什么区别?
- InnoDB支持事物,而MyISAM不支持事物
- InnoDB支持行级锁,而MyISAM支持表级锁
- InnoDB支持MVCC, 而MyISAM不支持
- InnoDB支持外键,而MyISAM不支持
- InnoDB不支持全文索引,而MyISAM支持。
总结
以上就是mysql常见面试题啦,希望能够帮到大家