【搞定面试之mysql】第一篇:mysql的优化和索引

前言:

在面试当中mysql可以说是非常重要的,几乎是面试必问,所以今天我们来学习,关于mysql面试部分的第一篇:mysql优化。

在这一篇我们有十四个问题,基本上是涵盖了优化部分的问题,接下来一起来看看吧。

MySQL中,如何定位 慢查询

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

那这个SQL语句执行很 慢,如何分析呢

如果一条SQL执行很慢,我们通常会使用MySQL的EXPLAI``N命令来分析这条SQL的执行情况。通过keykey_len可以检查是否命中了索引,如果已经添加了索引,也可以判断索引是否有效。通过type字段可以查看SQL是否有优化空间,比如是否存在全索引扫描或全表扫描。通过extra建议可以判断是否出现回表情况,如果出现,可以尝试添加索引或修改返回字段来优化。

了解过索引吗?( 什么是索引

嗯,索引在项目中非常常见,它是一种帮助MySQL高效获取数据的数据结构,主要用来提高数据检索效率,降低数据库的I/O成本。同时,索引列可以对数据进行排序,降低数据排序的成本,也能减少CPU的消耗。

索引的底层数据结构了解过吗

MySQL的默认存储引擎InnoDB使用的是B+树作为索引的存储结构。选择B+树的原因包括:节点可以有更多子节点,路径更短;磁盘读写代价更低,非叶子节点只存储键值和指针,叶子节点存储数据;B+树适合范围查询和扫描,因为叶子节点形成了一个双向链表。

B树和B+树的区别是什么呢?

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

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

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

什么是 聚簇索引什么是非聚簇索引

聚簇索引 就是数据和索引放在一起,叶子节点存的是一整行数据 。InnoDB里主键索引就是聚簇索引。
非聚簇索引 (也叫二级索引)叶子节点存的是主键的值。所以如果通过二级索引查数据,需要先找到主键,再回表查聚簇索引才能拿到完整数据。

知道什么是回表查询吗?

回表查询是指通过二级索引找到对应的主键值,然后再通过主键值查询聚簇索引中对应的整行数据的过程。

知道什么叫 覆盖索引

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

MySQL超大分页怎么处理

超大分页通常发生在数据量大的情况下,使用LIMIT分页查询且需要排序时效率较低。可以通过覆盖索引和子查询来解决。首先查询数据的ID字段进行分页,然后根据ID列表用子查询来过滤只查询这些ID的数据,因为查询ID时使用的是覆盖索引,所以效率可以提升。

索引创建原则有哪些?

创建索引的原则包括:

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

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

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

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

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

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

什么情况下索引会失效?

索引可能在以下情况下失效:

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

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

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

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

SQL的优化经验有哪些?

SQL优化可以从以下几个方面考虑:

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

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

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

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

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

创建表的时候,你们是如何优化的呢?
  • 字段类型够用就好 ,比如能用int不用bigint,能用varchar(50)不用varchar(255)

  • 尽量用not null,可以加默认值,因为null会让索引和统计变得更复杂

  • 主键最好是自增的,这样B+树插入时是顺序追加,不会频繁分裂

  • 如果确定不会用事务,可以考虑MyISAM(不过现在基本都是InnoDB)

  • 合理规划分表分库,避免单表数据量过大

在使用索引的时候,是如何优化呢?

在使用索引时,我们遵循索引创建原则,确保索引字段是查询频繁的,使用复合索引覆盖SQL返回值,避免在索引字段上进行运算或类型转换,以及控制索引数量。

相关推荐
Shinran永恒2 小时前
Android资源类型列举及四种常用的布局资源详细介绍
面试
重铸码农荣光2 小时前
手写一个精简版 Zustand:深入理解 React 状态管理的核心原理
react.js·面试·源码
本末倒置1832 小时前
告别"话痨"提交记录!Git 压缩 Commit 实战指南,代码洁癖党狂喜
面试·程序员·代码规范
sthnyph2 小时前
MySQL 8.0在windows环境安装及配置
windows·mysql·adb
我叫黑大帅3 小时前
🚀 JS 最常用的性能优化 防抖和节流
前端·javascript·面试
道清茗3 小时前
【MySQL知识点问答题】 MySQL 配置参数和内存管理
数据库·mysql
我叫黑大帅3 小时前
JS中的两大定时器
前端·javascript·面试
掘金安东尼3 小时前
⏰前端周刊第 458 期v2026.3.24
前端·javascript·面试
闻哥4 小时前
MySQL InnoDB 缓存池(Buffer Pool)详解:原理、结构与链表管理
java·数据结构·数据库·mysql·链表·缓存·面试