MySQL索引面试(更新)

本文介绍了索引的概念、优点与缺点,强调在大数据量下使用索引来提升查询效率的重要性。讨论了B+树作为索引数据结构的原因,并区分了聚簇索引与非聚簇索引,解释了InnoDB和MyISAM存储引擎的区别。最后提到了数据库最左匹配原则在联合索引中的应用。

索引介绍及特点:

概念:索引就是一个数据结构,我们把表中的记录用一个适合高效查找的数据结构来表示,目的就是让查询变得更高效。
优点:加快对表中记录的查找或排序
缺点:创建索引和维护索引需要成本,这个成本随着数据量的增加而加大
使用场景:数据库中表的数据量较大的情况下,对于查询响应时间不能满足业务需求,可以合理的使用索引提升查询效率。


面试问题:

谈谈你对索引的了解?

首先几种适合快速查找的数据结构,比如:hash(哈希)、二叉树,红黑树,B+树。
为什么不用hash?如果使用哈希作为索引,对ID做索引的话,可以对ID使用hash(ID),存储到合适的位置。但无法进行范围查找。
为什么不用二叉搜索树:因为会出现如下图这样的链状结构。多次与磁盘IO。

在这里插入图片描述
为什么不用红黑树呢?红黑树虽然层级降低了,但也需要多次I/O。
因此需要一个多叉排序树(B树),同时支持范围查找的结构,B+树就出现了。
B+树特点:
节点的子树数和关键字数相同(B 树是关键字数比子树数少一)
节点的关键字表示的是子树中的最大数,在子树中同样含有这个数据
叶子节点包含了全部数据,同时符合左小右大的顺序

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

MyISAM: B+Tree叶节点的data域存放的是数据记录的地址。在索引检索的时候,⾸先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其 data 域的值,然后以 data 域的值为地址读取相应的数据记录。这被称为“⾮聚簇索引”。

InnoDB: 其数据⽂件本身就是索引⽂件。相⽐MyISAM,索引⽂件和数据⽂件是分离的,其表数据⽂件本身就是按B+Tree组织的⼀个索引结构,树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据⽂件本身就是主索引。这被称为“聚簇索引(或聚集
索引)”。
从文件中可以看出 MyISAM存储引擎的mysql对表会存储三个文件,后缀名 MYI(索引文件),后缀名MYD(数据文件),后缀名frm(表字段结构文件)。而对于InnoDB存储引擎的表会存储两个文件,后缀名frm(表字段结构文件),后缀名ibd(数据文件)。

数据库最左匹配原则

建立联合索引时会遵循最左匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。具体看大佬的,美团一面时就问到了我实际的,没回答上来。链接。


### 三级标题:MySQL 索引常见面试问题及答案 #### 1. MySQL 中的索引类型有哪些?分别适用于什么场景? MySQL 支持多种索引类型,包括: - **B+Tree 索引**:这是最常见的索引类型,适用于大多数查询场景,包括等值查询和范围查询。在 InnoDB 存储引擎中,主键索引是聚集索引(Clustered Index),数据行与主键索引存储在一起 [^1]。 - **Hash 索引**:适用于等值查询,不支持范围查询和排序操作。Memory 引擎默认使用 Hash 索引 [^2]。 - **全文索引**:用于全文搜索,适用于大文本字段的模糊匹配。 - **空间索引**:用于地理空间数据类型的索引,如 `GEOMETRY` 类型字段。 #### 2. 联合索引的工作原理是什么?最左前缀原则是什么? 联合索引是指在多个字段上创建的索引。在联合索引中,最左前缀原则是指查询条件中必须包含索引的最左侧字段,才能使用索引。例如,对于联合索引 `(name, age)`,查询条件 `WHERE name = 'Alice'` 或 `WHERE name = 'Alice' AND age > 25` 可以使用索引,而 `WHERE age > 25` 则无法使用索引 [^1]。 此外,联合索引的最左匹配原则会一直向右匹配,直到遇到“范围查询”就会停止。这意味着范围查询的字段可以用到联合索引,但在范围查询字段后面的字段就不能用联合索引 [^2]。 #### 3. 什么是覆盖索引?它的作用是什么? 覆盖索引是指查询的字段全部包含在索引中,无需回表查询实际数据行。这种索引可以显著提高查询性能,因为它避免了额外的 I/O 操作。例如,如果有一个索引 `(name, age)`,查询 `SELECT name FROM users WHERE name = 'Alice' AND age > 25` 可以使用覆盖索引,而 `SELECT * FROM users WHERE name = 'Alice' AND age > 25` 则需要回表查询 。 #### 4. 索引下推优化(Index Condition Pushdown)是什么?它如何提升性能? 索引下推优化(Index Condition Pushdown, ICP)是在 MySQL 5.6 中引入的一种优化技术。它允许在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。例如,如果查询条件中包含 `WHERE name LIKE 'A%' AND age > 30`,ICP 会在索引扫描时提前过滤掉 `age <= 30` 的记录,从而减少不必要的回表操作 [^1]。 #### 5. 哪些情况下会导致索引失效? 以下是一些常见的导致索引失效的情况: - 查询条件中使用 `OR`,即使其中有条件带索引也不会使用,除非是主键。 - 查询条件中使用 `IS NULL` 或 `<>`,索引可能失效。 - 对联合索引,不使用最左前缀,则不会使用索引。 - `LIKE` 查询以通配符 `%` 开头,会导致索引失效,但以 `%` 结尾则可以继续使用索引。 - 如果列类型是字符串,条件中未使用引号引用数据,索引失效;如果列是数字类型,条件中加引号仍然可以使用索引。 - 如果 MySQL 估计使用全表扫描比使用索引更快,则不使用索引。 - 对索引列进行运算或函数计算会导致索引失效 [^1]。 #### 6. 聚簇索引和非聚簇索引的区别是什么? 聚簇索引(Clustered Index)是指数据行与主键索引存储在一起。InnoDB 存储引擎使用聚簇索引,主键索引的叶子节点存储的是实际的数据行。而非聚簇索引(Secondary Index)是指索引的叶子节点存储的是主键值,而不是数据行的物理地址。这意味着在使用非聚簇索引进行查询时,通常需要两次查找:第一次查找索引得到主键值,第二次通过主键查找实际数据 [^1]。 #### 7. 如何判断 MySQL 查询是否使用了索引? 可以通过 `EXPLAIN` 语句查看查询是否命中索引。例如: ```sql EXPLAIN SELECT * FROM users WHERE name = 'Alice'; ``` 输出中的 `key` 字段会显示实际使用的索引名称。如果 `key` 字段为空,则表示没有使用索引 。 #### 8. 如何优化 MySQL 索引以提高查询性能? 优化 MySQL 索引的方法包括: - **选择合适的字段建立索引**:通常应在频繁查询、排序、分组的字段上建立索引。 - **避免过多索引**:索引会占用磁盘空间并降低写入速度,因此应权衡查询与更新的需求。 - **使用联合索引时注意最左前缀原则**:联合索引的字段顺序会影响索引的命中情况,查询条件应尽量包含索引的最左侧字段。 - **定期分析与优化索引**:可以通过 `ANALYZE TABLE` 和 `EXPLAIN` 语句查看查询是否命中索引 。 #### 9. MySQL 中的 `COUNT()` 查询是如何工作的? 对于 `COUNT(主键字段)` 的查询,如果表中只有主键索引,没有二级索引,InnoDB 在遍历时会遍历聚簇索引,将读取到的记录返回给 server 层(server 层维护了一个 `count` 的变量),然后读取记录中的主键值,如果为 `NULL`,就将 `count` 变量 + 1。如果表中有二级索引,InnoDB 就会遍历二级索引 [^3]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值