【Java面试专题】MySql篇(一)

目录

1. MySQL中,如何定位慢查询?

2. 若SQL语句执行很慢,如何分析呢?

3. MySql支持的存储引擎及区别 ? 

4. 什么是索引?

5. 索引底层的数据结构

6. 聚簇索引和非聚簇索引

7. 回表查询

8. 覆盖索引

9. 索引创建的原则有哪些?

10. 什么情况下索引会失效?

总结


1. MySQL中,如何定位慢查询?

 

如何确认是慢查询?

通常在聚合查询、多表查询、表数据量过大查询、深度分页查询等情况下,页面加载过慢,接口压测响应时间过长(超过1s)

如何定位慢查询?

(1)在系统中部署运维监控系统Skywalking,在它的报表展示中可以看到哪个接口慢,并且能分析出接口中哪部分耗时较多,包括具体的SQL执行时间,这样就能定位到出现问题的SQL。

(2)使用Mysql自带慢日志功能。可以在MySQL的系统配置文件中开启慢查询日志,并设置SQL执行时间超过多少就记录到日志文件,比如我们之前项目设置的是2秒,超过这个时间的SQL就会记录在日志文件中,我们就可以在那里找到执行慢的SQL。

2. 若SQL语句执行很慢,如何分析呢?

可以采用 EXPLAIN 或者 DESC 命令获取 MySQL 如何执行 SELECT 语句的信息。 

  • 通过 key key_len可以检查是否命中了索引,如果已经添加了索引,也可以判断索引是否有效。
  • 通过type字段可以查看SQL是否有优化空间,比如是否存在全索引扫描或全表扫描。
  • 通过extra建议可以判断是否出现回表情况,如果出现,可以尝试添加索引或修改返回字段来优化。

关于各列字段的含义: 

3. MySql支持的存储引擎及区别 ? 

存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式 。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。

关于InnoDB: 

InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在 MySQL 5.5 之后,InnoDB是默认的 MySQL 存储引擎。

特点:  

  • DML操作遵循ACID模型,支持事务
  • 行级锁,提高并发访问性能
  • 支持外键 FOREIGN KEY约束,保证数据的完整性和正确性

4. 什么是索引?

索引(index)是帮助MySQL高效获取数据的数据结构(有序)。

在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

这里为了方便理解先以二叉树为例,如图所示:

可以发现,将age列的信息通过二叉树的形式存储,相比于之前的全表扫描效率可以大大提升!

5. 索引底层的数据结构

MySQL默认使用的索引底层数据结构是B+树。再聊B+树之前,我们先聊聊二叉树和B树:

而B树是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。 以一颗最大度数(max-degree)为5(5阶)的b-tree为例,那这个B树每个节点最多存储4个key:

而B+Tree是在BTree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构:

B树与B+树对比:

①:磁盘读写代价B+树更低;②:查询效率B+树更加稳定;③:B+树便于扫库和区间查询

所以之所以选择B+树,是因为:

(1)路径更多,节点可以有更多子节点

(2)磁盘读写代价更低,非叶子节点只存储键值和指针,叶子节点存储数据

(3)叶子节点形成了一个双向链表,适合范围查询和扫描

B树和B+树的主要区别在于:

  1. B树的非叶子节点和叶子节点都存放数据,而B+树的所有数据只出现在叶子节点,这使得B+树在查询时效率更稳定。

  2. B+树在进行范围查询时效率更高,因为所有数据都在叶子节点,并且叶子节点之间形成了双向链表。

6. 聚簇索引和非聚簇索引

 可能概念不是很好理解,我们可以根据图来理解:

7. 回表查询

         

8. 覆盖索引

覆盖索引是指在SELECT查询中,返回的列全部能在索引中找到,避免了回表查询,提高了性能。使用覆盖索引可以减少对主键索引的查询次数,提高查询效率。

MySql的超大分页就可以使用覆盖索引解决!

 

9. 索引创建的原则有哪些?

  • 表中的数据量超过10万以上时考虑创建索引。

  • 选择查询频繁的字段作为索引,如查询条件、排序字段或分组字段。

  • 尽量使用复合索引,覆盖SQL的返回值。

  • 如果字段区分度不高,可以将其放在组合索引的后面。

  • 对于内容较长的字段,考虑使用前缀索引。

  • 控制索引数量,因为索引虽然可以提高查询速度,但也会影响插入、更新的速度。

10. 什么情况下索引会失效?

  • 没有遵循最左匹配原则。

  • 使用了模糊查询且%号在前面。

  • 在索引字段上进行了运算或类型转换。

  • 使用了复合索引但在中间使用了范围查询,导致右边的条件索引失效。

总结

关于SQL的优化经验可以总结以下几点:

  • 建表时选择合适的字段类型。

  • 使用索引,遵循创建索引的原则。

  • 编写高效的SQL语句,比如避免使用SELECT *,尽量使用UNION ALL代替UNION,以及在表关联时使用INNER JOIN

  • 采用主从复制和读写分离提高性能。

  • 在数据量大时考虑分库分表。



    🌸  我们的目标应该是不断努力成为更好的人,并借着更远大的梦想扩张自己的界限  🌸

    ——《人生不设限》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值