一. 慢查询
在MySQL中,如何定位慢查询?
出现慢查询的情况有以下几种:
- 聚合查询
- 多表查询
- 表数据量过大查询
- 深度分页查询
表象:页面加载过慢,接口压测响应时间过长(超过1s)
1.2 如何定位慢查询?
方案一:开源工具
- 调试工具:Arthas
- 运维工具:Prometheus、Skywalking
方案二:MySQL自带慢日志
慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志,如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:
配置完毕之后,通过一下指令重新启动MySQL服务器进行测试,查看慢日志文件中记录的信息 /var/lib/mysql/localhost-slow.log。
总结
面试官:MySQL中,如何定义慢查询?
候选人:嗯~,我们当时做压测的时候有的接口非常的慢,接口的响应时间超过了2秒以上,因为我们当时的系统部署了运维的监控系统Skywalking,在展示的报表中可以看到是哪一个接口比较慢,并且可以分析这个接口哪部分比较慢,这里可以看到SQL的具体的执行时间,所以可以定位是哪个sql出了问题。
如果,项目中没有这种运维的监控系统,其实在MySQL中也提供了慢日志查询功能,可以在MySQL的系统配置文件中开启这个慢日志的功能,并且也可以设置SQL执行超过多少时间来记录到一个日志文件中,我记得上一个项目配置的是2秒,只要SQL执行的时间超过了2秒就会记录到日志文件中,我们就可以在日志文件找到执行比较慢的SQL了。
二. SQL语句执行很慢,如何分析
那这个SQL语句执行很慢,如何分析呢?
2.1 分析
可以采用WXPLAIN或者DESC命令获取MySQL如何执行SELECT语句的信息
总结
面试官:那这个SQL语句执行很慢,如何分析呢?
候选人:如果一条sql执行很慢的话,我们通常会使用mysql自动的执行计划explain来去查看这条sql的执行情况,比如在这里面可以通过key和key_len检查是否命中了索引,如果本身已经添加了索引,也可以判断是否有失效的情况,第二个,可以通过type字段查看sql是否有进一步的优化空间,是否存在全索引或全盘扫描,第三个可以通过extra建议来判断,是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复
三. 了解过索引吗?(什么是索引)
了解过索引吗?(什么是索引)
索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据上实现高级查找算法,这种数据结构就是索引。
索引的底层数据结构了解过吗?
3.1 数据结构对比
MySQL默认使用的索引底层数据结构是B+树。再聊B+树之前,先聊聊二叉树和B树
B-Tree,B树是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。以一颗最大度数(max-degree)为5(5阶)的b-tree为例,那这个B树每个节点最多存储4个key
B+Tree是在BTree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构
总结
四. 聚簇索引和非聚簇索引
什么是 聚簇索引和非聚簇索引?
什么是聚集索引,什么是二级索引(非聚集索引)
什么是回表
4.1 聚集索引,二级索引(非聚集索引)
4.2 回表查询
总结
注意:如果面试官直接问什么是回表查询,要先解释一下聚集索引和二级索引
五. 覆盖索引
5.1 覆盖索引
查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到。
5.2 MYSQL超大分页处理
在数据量比较大时,如果进行limit分页查询,在查询时,越往后,分页查询效率越低。
优化思路:一般分页查询时,通过创建覆盖索引 能够比较好的提高性能,可以通过覆盖索引加子查询形式进行优化
总结
六. 索引创建原则
索引创建原则有哪些?
回答这个问题,首先要陈述一下自己在实际的工作中是怎么用的,比如用到了主键索引、唯一索引或者是根据业务创建的索引(复合索引)
- 针对于数据量较大,且查询比较频繁的表建立索引。 单表超过10万数据(增加用户体验)
- 针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。
- 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。
- 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。
- 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储时间,避免回表,提高查询效率
- 要控制索引的数量,所以并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率
- 如果索引不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好的确定哪个索引最有效的用于查询
总结
七. 索引失效
在什么情况下,索引会失效?
索引失效的情况有很多,可以说一些自己遇到过的,不要张口就说一推背诵好的面试题(适当的思考一下,更真实)
1)违反最左前缀法则
违反最左前缀法则,索引失效:
2)范围查询右边的列,不能使用索引。
3)不要咋索引列上进行运算操作,索引将失效
4)字符串不加单引号,造成索引失效。
5)以%开头的Like模糊查询,索引失效。如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效
总结
八. 谈一谈对sql优化的经验
谈一谈对sql优化的经验
8.1 表的设计优化
参考阿里开发手册《嵩山版》
8.2 索引优化
8.3 SQL语句优化
8.4 主从复制、读写分离
如果数据库的使用场景读的操作比较多的时候,为了避免写的操作所造成的性能影响,可以采用读写分离的架构。读写分离解决的是,数据库的写入,影响了查询的效率。