MySQL面试题

98 阅读8分钟

1、Mysql的搜索引擎?
Mysql的主要搜索引擎有MyISAM和InnoDB。
MyISAM和InnoDB的区别:
(1)MyISAM不支持事务,InnoDB支持事务
(2)MyISAM只支持表级锁,InnoDB除了表级锁,还支持行级锁
(3)MyISAM不支持外键,InnoDB支持外键
(4)MyISAM不支持聚集索引,InnoDB支持
(5)MyISAM不支持MVCC,InnoDB支持

2、事务的四大特性?
(1)原子性:事务中的操作要么都成功,要么都失败
(2)一致性:无论事务成功与否,数据的状态都要与事务前后保持一致
(3)隔离性:主要与事务的隔离级别有关
(4)持久性:事务提交成功后,数据的修改就是永久的

3、事务的隔离级别有哪些?
事务的隔离级别设置是为了解决脏读和幻读的问题。
(1)脏读:一个事务读取了另一个事务还未提交的结果
(2)不可重复读:一个事务并发更新时,另一个事务查询两次相同数据的前后结果不相同
(3)幻读:一个事务并发新增或者删除时,另一个事务查询两次相同数据的前后结果不相同
为了解决这些问题,事务有四种隔离级别:
(1)read uncommitted:这种会造成脏读
(2)read committed:这种会解决脏读,但是会导致不可重复读问题
(3)repeatable read:默认使用的,既解决了脏读又解决了不可重复读问题;并且配合间隙锁,解决了幻读的问题
(4)serializable:最高级别的隔离,事务按照顺序执行,解决了所有问题

4、MySQL数据库的索引数据结构?
B+树。索引的B+树,叶子节点上存放的是索引列的值、主键的值和数据地址,非叶子节点存放的是索引列的值和其他节点地址。叶子节点从左到右按照索引列的值从小到大的顺序排序。而且叶子节点由双向链表连接。这样方便范围查询和模糊查询。

5、为什么选择B+树,而不是B树?
(1)B+树的节点不会存放太多数据,而B树每个节点都会存放数据,这样会导致加载的时候,B树会触发多次IO才能加载到内存中,影响效率
(2)B+树的叶子节点数据是双向链表,并且按照顺序排序,所以方便进行范围查询和模糊查询
(3)B+树查询效率比较稳定,必须查询到叶子节点才能查到数据,而B树不确定查询到哪个节点

6、为什么不使用哈希表作为索引结构?
(1)哈希表存在哈希冲突问题
(2)哈希表无法进行范围查询
(3)哈希表无法进行模糊查询

7、索引类型有哪些?
(1)聚集索引:每个表只有一个聚集索引,是以主键作为索引,没有主键就用隐形主键。聚集索引叶子节点上都是数据
(2)辅助索引:除了主键外其他字段设置为索引,就是辅助索引。辅助索引叶子节点存放的是主键信息,根据主键信息到聚集索引上查询数据,这个操作是回表操作
(3)联合索引:将两个或以上的字段作为索引,称为联合索引

8、什么是覆盖索引?
从辅助索引中就能查询出想要的数据。因为辅助索引中,B+树节点上存放了索引字段的数据,如果是查询这些数据,就是覆盖索引

9、索引的设计原则?
(1)字段枚举越多,越适合做索引
(2)业务中经常被用来当做查询条件的,适合做索引
(3)经常需要排序、分组和联合查询的,适合做索引
(4)频繁增删改的字段不适合做索引
(5)数据量很大的字段不适合做索引

10、什么是最左前缀原则?
例如在模糊查询中,查询姓张的人名,那么会遍历B+树的叶子节点,从左到右遍历,找到第一个开头是张的数据,然后依次往右查询,直到出现开头不是张的数据为止。

11、联合索引在查询时是怎么使用的?
例如有(a,b,c)这样的联合索引。首先查询a索引是否匹配,如果匹配,在匹配的范围内,查询b索引是否匹配。因为在B+树上,a索引是全局有序的,而b索引和c索引是局部有序的。在发现a和b索引都匹配的范围内,再查询c索引。

12、索引在什么时候失效?
(1)模糊查询时,没有利用最左前缀原则
(2)查询的条件字段是联合索引中非左边的那个
(3)判断索引字段是否不等于某个值
(4)对索引字段进行运算

13、MySQL有哪些锁?
(1)共享锁:多个事务可以读取数据,不能修改数据
(2)排他锁:某一事务对数据上了排他锁,其他事务无法对其读取和修改
(3)意向共享锁:在获取共享锁之前,要获取表的意向共享锁。其他事务要对表加排他锁会先检查是否加了意向共享锁,有的话就不能加排他锁
(4)意向排他锁:在获取排他锁之前,要对表加上意向排他锁。其他事务要对表加共享锁或者排他锁,需要检查是否加了意向排他锁,如果加了就不能加锁

14、MySQL按照粒度划分锁?
(1)行级锁:对表中的数据行加锁
(2)表级锁:对某一张表加锁

15、Select语句的执行顺序?
select语句中一般有from、where、group by、having、limit、order by字句,执行顺序也是这样。

16、where和having的区别?
where后面的过滤条件是针对整张表的数据,having是针对group by分组后的数据。而且having后面一般是聚合函数条件。

17、count(*)与count(列名)的区别?
答:count(*)是计算非null行的个数。count(列名)是计算特定列中非null的个数。

18、第一二三范式的作用?
(1)第一范式,数据不能再分割,保证数据的独立性
(2)第二范式,每项数据都有唯一的标识,保证数据的唯一性
(3)第三范式,表中的列不能存在传递依赖,保证数据的独立性和一致性
三个范式保证在设计表的时候,不会出现设计冗余,不一致的现象。

19、redo log与undo log的区别?
redo log中记录的是数据库的数据修改信息,而undo log中记录的是数据修改前的信息,这样在事务回滚时,可以快速恢复数据。undo log的另一个作用是MVCC。

20、redo log和bin log的区别?
bin log是数据库级别的日志,而redo log是存储引擎级别的日志,即只有InnoDB才有。bin log中记录了数据库的改动,存放了对应的sql语句。redo log是InnoDB记录的操作的详细信息。

21、bin log和事务日志的先后顺序?
一般是先bin log,然后事务执行完成后,才是事务日志。

22、mysql中drop、truncate和delete的区别?
drop会删除表以及表中的数据;truncate不会删除表,但是会删除表中所有的数据;delete可以删除表中的部分数据。

23、什么是当前读和快照读?
(1)当前读是读取此时此刻的数据,这种读取方式具有时效性,但是可能遇到脏读或幻读的问题。例如:update、insert、delete,这些语句先读取数据,再进行修改,属于当前读。还有select...for update,select...lock in share mode
(2)快照读是读取某个时间点的数据,好处是不会受到当前事务的影响。缺点是可能读到的不是最新的数据。普通的select语句就是快照读,不会加锁。

24、常见的数据库连接池参数?
(1)连接的最大空闲时间:超过这个时间,连接被回收
(2)空闲连接的扫描时间:每隔这段时间,会扫描连接池中的连接,空闲连接等待被回收
(3)最大活跃连接数:连接池中只允许最多有这么多个线程
(4)最小空闲连接数:保证最少有这么多个连接存在
(5)最大连接等待时间:连接失败后的最大等待时间,超过时间报异常

25、对MVCC的理解?
MVCC是为了解决数据库并发问题的多版本并发控制操作。在读写并发的情况下,一个事务要读取某行数据时发现另一个事务对这行数据上锁了,并且在更新这行数据。此时这个事务无需等待锁的解放,可以在undo.log中读取旧版本的数据。这样可以提高并发情况下的响应。