目录
问题一:在MySQL中,如何定位慢查询?
方案一:开源工具
方案二:MySQL自带慢日志
模拟面试
问题二:这个SQL语句执行很慢,如何分析的呐?
模拟面试
问题三:了解过索引吗?(什么是索引)
索引的底层数据结构了解过吗?
模拟面试
编辑
问题四:聚簇索引和非聚簇索引
回表查询
编辑 模拟面试
问题五:覆盖索引、超大分页优化
覆盖索引
编辑 MYSQL超大分页处理
优化思路
模拟面试
问题六:索引创建原则有哪些?
模拟面试
问题七:什么情况下索引会失效?
编辑 1、违反最左原则
编辑 2、范围查询右边的列,不能使用索引
3、不要再索引列上进行运算操作,索引会失效
4、字符串不加单引号,可能会造成索引失效
编辑 5、以%开头的like模糊查询,索引失效。如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。
模拟面试
编辑 问题八:谈谈你对sql优化的经验?
表的设计优化
SQL语句的优化
主从复制、读写分离
模拟面试
问题九: 事务的特性
什么是事务?
ACID是什么 ?
模拟面试
编辑 问题十:并发事务带来了哪些的问题?怎么解决这些问题?MySQL的默认隔离级别是什么?
并发事务问题
模拟面试
问题十一: undo log和redo log的区别
redo log
undo log
模拟面试
问题十二: 事务的隔离性是如何保证的呐?
解释一下MVCC
记录中的隐藏字段
undo log
undo log的版本链
readView
模拟面试
问题十三:MySQL的主从同步原理
模拟面试
问题十四: 分库分表
拆分策略
垂直分库
垂直分表
水平分库
水平分表
新的问题和新的技术
问题一:在MySQL中,如何定位慢查询?
方案一:开源工具
调试工具:Arthas
运维工具:Prometheus、Skywalking
方案二:MySQL自带慢日志
慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志
如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:
配置完毕之后,通过以下指令重新启动MySQL服务器进行测试,查看慢日志文件中记录的信息
/var/lib/mysql/localhost-slow.log
模拟面试
问题二:这个SQL语句执行很慢,如何分析的呐?
可能的原因:
一个SQL语句执行很慢,如何分析?
可以采用EXPLAIN或者DESC命令获取MySQL如何执行SELECT语句的信息
- possible_key 当前sql可能会使用到的索引
- key 当前sql实际命中的索引
- key_len 索引占用的大小
其中可以通过第二点和第三点来查看是否可能会命中索引- Extra 额外的优化建议
- type 这条sql的连接的类型,性能由好到差为NULL、system、const、eq_ref、ref、range、index、all
如果出现后两种情况,就说明这条sql就需要优化了
模拟面试
问题三:了解过索引吗?(什么是索引)
索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
索引的底层数据结构了解过吗?
MySQL默认使用的索引底层数据与结构是B+树。
B+Tree是在BTree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构
模拟面试
问题四:聚簇索引和非聚簇索引
回表查询
给name加了索引,所以它会走二级索引这条,查到之后,查到的其实是id等于10这个数据,然后再走聚集索引再查一遍,最后查到整行数据,这个过程就是回表查询(其实就是:先走二级索引查询,查到对应的主键值之后,再走聚集索引查询,查到整行数据)
模拟面试
问题五:覆盖索引、超大分页优化
覆盖索引
覆盖索引是指查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到。
MYSQL超大分页处理
在数据量比较大时,如果进行limit分页查询,在查询时,越往后,分页查询效率越低。
优化思路
一般分页查询时,通过创建覆盖索引能够比较好地提高性能,可以通过覆盖索引加子查询形式进行优化
和上面相比执行时间确实减少了很多
模拟面试
问题六:索引创建原则有哪些?
模拟面试
问题七:什么情况下索引会失效?
1、违反最左原则
以下情况跳过了name字段,索引失效
2、范围查询右边的列,不能使用索引
后一个情况的address的索引失效
3、不要再索引列上进行运算操作,索引会失效
4、字符串不加单引号,可能会造成索引失效
5、以%开头的like模糊查询,索引失效。如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。
模拟面试
问题八:谈谈你对sql优化的经验?
表的设计优化
SQL语句的优化
主从复制、读写分离
如果数据库的使用场景读的操作比较多的时候,为了避免写的操作所造成的性能影响 可以采用读写分离的架构。
读写分离解决的是,数据库的写入,影响了查询的效率
模拟面试
问题九: 事务的特性
什么是事务?
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败
ACID是什么 ?
模拟面试
问题十:并发事务带来了哪些的问题?怎么解决这些问题?MySQL的默认隔离级别是什么?
并发事务问题
注意:事务隔离级别越高,数据越安全,但是性能越低。
模拟面试
问题十一: undo log和redo log的区别
redo log
undo log
undo log可以实现事务的一致性和原子性
模拟面试
问题十二: 事务的隔离性是如何保证的呐?
解释一下MVCC
全称Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突
MVCC的具体实现,主要依赖于数据库记录中的隐式字段、undo log日志、readView
记录中的隐藏字段
undo log
undo log的版本链
不同事务或相同事务对同一条记录进行修改,会导致该记录的undolog生成一条记录版本链表,链表的头部是最新的旧纪录,链表尾部是最早的旧纪录
readView
、
模拟面试
问题十三:MySQL的主从同步原理
mysql主从复制的核心就是二进制日志
二进制日志(binlog)记录了所有哦的DDL语句(数据定义语言)和DML语句(数据操纵语言),但不包括数据查询(select、show)语句
模拟面试
问题十四: 分库分表
拆分策略
垂直分库
以表为依据,根据业务将不同表拆分到不同库中
特点: