这里根据个人说话口吻等编写Mysql常见面试题用于记录复习,后续会持续更新补充,欢迎点赞收藏。
Mysql索引
什么是索引
索引是一种帮助mysql高效获取数据的数据结构,就好比书籍的目录。如果没有索引mysql将会全表扫描,时间复杂度为On。而通过b+树的二分查找则搜索复杂度为O(logN)。
索引有什么分类
数据结构:b+tree索引,hash索引,full-text索引
物理存储:聚簇索引,非聚簇索引
字段特性:主键索引,唯一索引,普通索引,前缀索引
字段个数:单列索引,联合索引
聚簇索引与非聚簇索引的区别是什么
1.聚簇索引的索引结构本身就是数据的物理存储结构,非聚簇索引则只是包含指向数据行的指针或主键值
2.通过聚簇索引查找数据可以直接从索引中获取数据行,而通过非聚簇索引查找数据需要先找到对应的主键值再回溯到聚簇索引中查找实际的数据行
3.聚簇索引基于主键构建,因此每个表只有一个,而非聚簇索引可以有多个
4.一般情况下由于聚簇索引不需要回表,因此查询效率更高。而在使用覆盖索引的情况下,非聚簇索引的效果更高,因为不需要读取完整数据
什么是覆盖索引
覆盖索引是指一个索引包含了查询需要的所有列,因此不需要访问表中的数据行就能完成查询
索引失效场景
1.使用左或者左右模糊匹配的时候
2.在查询条件中对索引使用函数
3.在查询条件中对索引进行表达式计算
4.索引字段发生隐式类型转换,类似于对索引使用函数
5.联合索引没有正确使用最左匹配原则
6.where子句中,or前条件列是索引列,or后条件列不是索引列。
B+树的底层数据结构是怎样的
B+树是多路平衡查找树,可分为叶子节点与非叶子节点。非叶子节点只存储键值与指针,叶子节点存储数据。由于叶子节点间形成了一个双向链,因此B+树很适合范围查询和扫描。
B树与B+树的区别是什么
1.B树的非叶子节点与叶子节点都存数据,而B+树的所有数据都只存在叶子节点,因此B+树查询效率更稳定
2.B+树叶子节点之间有双向链表,因此范围查询时效率更高
什么是回表查询
回表查询是指通过二级索引找到对应主键值,再通过主键值查询主键索引中对应的整行数据过程
Mysql锁
mysql有哪些锁
1.根据加锁范围可分为,全局锁,表级锁和行锁三类。
2.根据锁的兼容性可分为共享锁(s锁,读锁),排他锁(X锁,写锁)
3.根据锁的使用方式又可分为,隐式锁(自动加锁),显式锁(手动加锁)
4.根据锁的算法又可分为,记录锁,间隙锁,临键锁。
Mysql事务
事务特性有哪些,如何实现
1.原子性,一致性,隔离性,持久性。
2.持久性通过redo log实现。原子性通过undo log实现。隔离性通过MVCC实现。一致性通过持久性+原子性+隔离性实现。
并发事务会带来哪些问题
1.并发事务可能造成脏读,不可重复读,幻读,
2.脏读是指一个事务读取到另一个事务未提交的数据。不可重复读是指由于其它事务的修改,导致该事务多次读取同一数据不一致。幻读是指一个事务读取到其它事务插入的幻行
mysql的隔离级别有哪些,怎么解决并发事务带来的问题
1.读为提交,难以解决任何问题
2.读已提交,能解决脏读
3.可重复读,能解决脏读,不可重复读。这也是默认的mysql隔离级别
4.串行化,能解决所有问题
5.mysql的隔离级别基于锁与mvcc共同实现。除了可串行化,其余隔离级别均用mvcc实现。(也可能需要用到锁机制)
undolog与redolog是什么
1.undolog记录的是逻辑日志,保证了事务的原子性。记录了事务开始前的数据状态,用于事务的回滚。
2.redolong记录的是数据页的物理变化,保证了事务的持久性。记录了事务完成后的数据状态,用于服务宕机后的恢复。
MVCC(多版本并发控制)是什么
MVCC保证了事务的隔离性。MVCC通过维护数据多个版本避免读写冲突。底层实现包含隐藏字段,undolog,readview。而隐藏字段又包含trx_id(事务id)和roll_pointer(回滚指针)。undolog 记录了不同版本的数据,并通过roll_pointer形成版本链。read view定义里不同隔离级别下的快照读,决定事务访问哪个版本的数据。
Mysql架构与存储引擎
说说innodb与myisam的区别
1.事务:Innodb支持事务,myisam不支持事务
2.锁粒度:innodb的最小锁粒度是行锁,myisam的最小锁粒度是表锁。因此myisam的并发访问受限程度大
3.索引结构:innodb是聚簇索引,myisam是非聚簇索引。
4.外键:innodb支持外键,myisam不支持外键。但一般我们都是在业务代码中进行约束以避免不必要的性能损耗
MySQL 基础架构

执行一条sql请求的过程是什么
1.先通过连接器,建立连接,管理连接,校验用户身份
2.再查询缓存,如果缓存命中则返回,否则继续查询
3.然后通过分析器对sql进行词法分析与语法分析
4.接着进行sql执行。先通过优化器进行预处理,sql优化,再利用执行器操作存储引擎。
数据管理中,数据文件大体分为哪几种
1.创建一个database,会在var/lib/mysql/目录里创建一个以database为名的目录
2.在该目录中有三个文件db.opt,t_order.frm,t_order.ibd.
3.db.opt用来存储默认字符集与字符校验规则。t_order用来存表结构。t_order.ibd存表数据
什么是binlog和relaylog
binlog是二进制日志,是server层生成的日志,记录了所有库表结构变更和表数据修改,主要用于数据备份与主从复制。
relaylog是中继日志,用于主从复制,slave通过io线程拷贝master的binlog后本地生成的日志
主从复制的原理是什么
1.主库在事务提交时将数据变更提交到binlog
2.从库读取主库的binlog并写入中继日志
3.从库重做中继日志的事件,反映到自己数据中
分表和分库是什么?有什么区别?
1.分库是按照一定规则将数据划分到独立数据库中,而分表则是将单个数据库的表拆分成多个表。
2.分库分表有垂直,水平两种维度的拆分。垂直拆分一般是按照功能,字段进行拆分,而水平拆分一般是不改变结构降低数据量的拆分。
3.在之前的微服务项目中,每个微服务对应一个数据库实现垂直分库。而在协同编辑图库项目中根据picture实现水平分表。
Mysql性能调优
如何定位慢查询
1.在配置文件中开启慢查询日志。规定超过多少秒记录到日志里,在我的项目里设置的两秒。
2.通过运维监控系统skywalking,在报表展示中查看哪个接口慢,分析哪部分耗时。
定位到sql了再具体怎么分析
1.我通常使用explain命令来分析该sql的执行情况
2.可通过key,key_len字段检查是否命中索引,通过tyep查看数据的扫描类型,通过extra来判断是否出现回表情况
sql优化
1.尽量避免select *的写法
2.使用union all替代union,避免排重造成的性能损耗
3.使用小表驱动大表,比如表关联时优先使用inner join。
4.批量操作替代循环操作
5.索引优化
6.建表时选择合适的数据类型,可参考《嵩山版》开发手册
索引优化
1.使用前缀索引优化
2.使用覆盖索引优化
3.避免索引失效
4.主键索引最好自增,这样可以让新加入的数据按顺序添加到当前节点位置。而非自增主键会导致每次插入主键的索引值都是随机的,不仅消耗性能甚至可能导致页分裂,从而造成大量内存碎片。
怎么处理超大分页
如果使用limit分页查询排序效率非常低下,因此我选择使用覆盖索引与子查询来解决。通过子查询来查询需要的id字段进行分页,再根据id实现精准查询
