MySQL优化相关的面试题
1.MySQL相关的优化。
答:表的数据优化,SQL语句的优化(如少于select * ,避免索引失效),主从复制,读写分离(不让读操作影响写操作)。
2.索引失效的场景。
答:1.违反最左前缀法则。举例:根据自己的项目,运用到了联合索引,将某些字段设置了联合索引,name,score,可是在查询时写出where score = 13,没有涉及到第一个name,就会出现索引失效的情况。
2.在索引字段上进行运算的操作。
3.在字符串上面不加单引号,如where name = aaa。
4.使用以% 开头的模糊查询。
3.如何判断索引是否失效呢?
答:使用explain关键字,在sql语句之前加上explain关键字,这样就可以查看这个SQL语句的详情,通过观察ken 和 ken_len可以判断是否命中了索引,如果ken和ken_len出现了null,那肯定是没有命中索引。
4.如何定位慢查询?
答:开启MYSQL自带的慢日志查询,通过设置一个时长,如果我们设置为1s,则超过1s就会被记录下来到日志上。
5.索引是什么?索引的底层是用什么来实现的?
答:索引是帮助mysql高效获取数据的数据结构,可以帮助提高查询速度。
底层是用B+树来实现的,叶子节点是双向链表,存储键值,非叶子节点只存储指针。
6.什么是聚集索引,二级索引,和回表查询?
答:聚集索引是数据和索引放一块,叶子节点保留整行数据。
二级索引是数据和索引分开放,叶子节点只保留主键值。回表查询就是先通过二级索引查询出主键值,然通过聚集索引查询出整行数据。覆盖索引是指查询使用的索引,一次性全部找到所需要的列。
MySQL事务相关的面试题
1.MySQL事务的特性。
答:原子性,一致性,持久性,隔离性。可以举一个转账的例子来说明:假设我给我朋友转账,我转钱和他收钱这两个事务要么一起发生要么都不发生这就体现了原子性,我转完后,我确确实实扣了钱,他确确实实多了钱,这就体现了一致性,转完后,我这个扣的钱就扣了不会跑回来,这个就体现了持久性,我给他转钱不会受到其他人的干扰这就体现了隔离性。
2.并发事务所带来的问题。
答:1.脏读。举个例子,假设我有两个并发事务,然后我第一个事务读取数据,第二个事务修改了数据但是没有提交,因此如果第一个事务在第二个事务之后发生,那他读取的就是一个错误的数据,因为第二个事务还没有提交。
2.不可重复读。举个例子,还是两个并发事务,第一个事务读取一个数据后另一个并发的事务修改了数据,然后再次读取时发现读取的数据跟第一次读取的数据不一样。
3.幻读。举个例子,还是两个并发的事务,一个事务读取数据发现没有这个数据准备添加这个数据,但是另一个事务添加了数据,然后第一个事务发现添加不进去了,然后它又查询数据发现数据又不见了(已解决不可重复读的问题),这样就好像发生了幻觉一样读取数据。
3.MySQL的事务隔离机制。
答:未提交读,什么都解决不了。读已提交,可以解决脏读的问题。可重复读,可以提交不可重复读的问题。串行化,可以解决脏读,不可重复读,幻读的问题,但是把并行改成串行性能降低了,不太合适。
4.redo log,undo log和mvcc
答:redo log是记录物理日志,记录的是数据页的物理变化,当服务宕机时可以用来同步数据。undo log是记录逻辑日志,实现一致性和原子性,当事务回滚时,通过逆操作来恢复数据。mvcc是多版本并发控制的缩写,用来维护一个数据的多个版本使读写操作者不会发出冲突。实现:通过隐藏事务id字段,和undo日志来构建版本链并通过ReadView机制判断事务应该看到哪个版本的数据,在不太的隔离级别下MVCC页不同。
5.如何保证对事务的隔离性?
答:用锁,使用排他锁,当事务获取了排他锁时就不允许获得别的锁。