MySQL相关面试题
1、如何处理Mysql的慢查询?
(1)开启慢查询日志,准确定位到哪个sql出问题(自定义时间参数)
(2)分析sql语句,看看是否load了额外的数据。可能是查询了多余的行,也可能加载了许多结果中不需要的列。
(3)分析语句的执行计划,查看索引使用情况,优化索引查询
(4)若无法对语句优化,考虑表中数据量是否太大,横向或纵向分表
2、Mysql的隔离级别有哪些?
低级别的隔离一般支持更高的并发处理
读取未提交内容(脏读、幻读、不可重复读):效率最高,安全最低(几乎不用)。读取的数据没用
读取已提交内容(不可重复读,幻读):一定程度上解决了脏读问题,产生不可重复读问题(并发读取结果不一样)。效率足够高
可重复读(默认,幻读):解决“不可重复读”问题,保证同一事务多个实例并发读取时,会看到相同结果,会产生“幻读”问题。
可串行化(最高的隔离级别):强行事务排序,不可能相互冲突。每个读得数据行上加锁。会导致超时和锁竞争(很少使用)
问题:
脏读:一个事务读取另一个事务未提交的数据,读取的数据并非是最终持久化数据
不可重复度:在一个食物内读取表中某一行数据,多次读取结果不同
幻读:是指一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
3、Mysql复制原理是什么?
主从复制,读写分离。
原理:Master主机生成二进制Log文件,Slave从机IO 线程读取二进制Log文件并写入Relay Log,Slave sql线程Relay日志的读取、rePlay在本地重放,使得数据和主节点保持一致,最后IO线程和sql线程进入休眠,等待唤醒。
4、mysql聚簇和非聚簇索引的区别是什么?
MyISam 存储引擎(表锁)
.frm 表结构
.MYD 数据文件
.MYI 索引文件
INNODB 存储引擎(行锁,默认)
.frm 表结构
.ibd 数据和索引文件(主键、唯一键、6字节rowid)
既有聚簇索引,又有非聚簇索引。
聚簇索引:跟数据绑定在一起的索引; 反之,非聚簇索引。
其他索引的叶子节点中存储的都是聚簇索引的key值
5、索引的基本原理
(1)什么是索引?
是一种key,是存储引擎快速找到记录的一种数据结构。(相当于目录)
(2)索引的数据结构:B+树索引、Hash索引
Innodb存储引擎:B+树索引
层数越多,数据量指数增长,适合范围查询
Memory存储引擎(内存中,断电丢失):Hash索引
单条记录查询快,范围查询慢
每个key对应一个value,散列方式分布,不支持范围查找和排序;
(3)B+树实现索引上的优势及过程
6、mysql锁的类型
共享锁(读)、排它锁(写)
行锁(Innodb)、表锁(MyISAM)
7、mysql为什么要主从同步?
读写分离
架构扩展,多库存储,分库分表,降低磁盘I/O访问频率
8、什么是Mysql的主从复制?
异步复制实现从主节点复制到多个从节点,实现读(从机)写(主机)分离。
9、mysql执行计划怎么看?
id:id相同(多表查询),顺序执行;id不同(子查询),id越大优先级越高;id有相同有不同,相同当一组,id越大优先越高,其余顺序执行
table:哪个表
type:system - const - 【eq_ref - ref - range - index - all(全表查询)】
key:实际使用的索引
rows:被索引优化查询的数据个数
extra: using filesort(消耗大额外排序)、 using temporary(消耗大用到临时表)、 using index(索引覆盖)、using where(回表查询)
10、什么是MVCC?
多版本并发控制。目的:提高数据库并发性能,处理读写冲突。(不加锁,非阻塞并发读)
当前读(最新数据):读取保证最新且并发事务不能修改当前记录,对读取的记录进行加锁。
快照读(历史数据):提高数据库并发的查询能力,不加锁非阻塞读,前提是隔离级别不是串行级别。(串行级别下快照读会变成当前读)
mvcc是类似行锁的一种,避免加锁,降低开销,基于多版本,数据不一定是最新版本。
MVCC多版本并发控制指的是维持一个数据的多个版本,使得读写操作没有冲突,快照读是Mysql为实现MVCC的一个非阻塞读功能。具体实现由3个隐式字段undo日志、read 、view三个组件来实现。
11、事务的基本特征是什么?
事务的四大特征:原子性、一致性、隔离性、持久性
原子性:要不全成功,要不全失败
一致性:事务前后的数据完整性要保持一致。
隔离性:多用户并发访问数据库时,多事务操作互不影响
持久性:事务一旦提交则不可逆,被持久化到数据库中!
12、ACID是靠什么保证的?
原子性:是是由回滚来保证
一致性:是其他三大特征的保证
隔离性:是由MVCC(多版本并发控制)来保证
持久性:由redolog来保证。mysql修改数据会在redolog中记录日志数据,数据没有保存成功,只要日志保存成功,数据就不会丢失。
13、索引的设计原则有哪些?
索引占用磁盘空间,并不是越多越好。
where子句的列或连接子句的列
基数小的表不适合加索引(基数指可能出现的值,累加值最好)
外键的列已经要创建索引
频繁更新的列不要有索引
大文本、大对象不要创建索引
14、mysql如何做分布式锁?
创建表,设置主键或唯一key,这个key就是要锁的key,同一个key在mysql表里只能插入一次,将锁竞争交给了数据库,处理同一个key数据库保证了只有一个节点能插入成功,其他节点都会插入失败。
其他想要进行插入数据的并发请求必须等第一次请求执行完毕后删除id为1的数据才能继续插入,实现分布式锁功能。