【275期】面试官:你对MySQL中的索引了解多少?

【275期】面试官:你对MySQL中的索引了解多少?

前言

因为现在使用的mysql默认存储引擎是Innodb,所以本篇文章重点讲述Innodb下的索引, 顺带简单讲述其他引擎。希望小伙伴们能通过这片文章对mysql的索引有更加清晰的认识,废话不多说,我们开始吧。

索引介绍

首先,我们先带着一些问题来看接下来的内容。

  • 索引是个什么东西?
  • 我们可以创建哪些索引?
  • 哪些字段适合建立索引呢?
  • 索引是不是越多越好呢?
  • 为什么我们不建议使用uuid、身份证号等数据做为主键?
  • 为什么不建议使用select * from table?
  • 我们使用模糊匹配 ’%三‘ ’张%‘ 在前在后会影响索引的使用吗?

上面的问题我们大家可能都存在或者部分存在疑惑,接下来就是解惑的时间。

什么是索引

在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

【275期】面试官:你对MySQL中的索引了解多少?

mysql中索引有哪些类型

普通索引

通索引是mysql里最基本的索引,没有什么特殊性,在任何一列上都能进行创建。

EXPLAIN SELECT *
FROM user_innodb
WHERE name LIKE '%张' and phone = '13204776301';

这种情况下因为phone在索引第一位,所以无论有没有name这个条件都会走索引。

【275期】面试官:你对MySQL中的索引了解多少?我们可以看到extra里面存在Using index condition(ICP),ICP的全名是index condition pushdown索引条件下推。

ICP 索引条件下推

索引条件下推(ICP)是针对MySQL使用索引从表中检索行的情况的一种优化。如果不使用ICP,则存储引擎将遍历索引以在基表中定位行,并将其返回给MySQL服务器,后者将评估WHERE行的条件。

启用ICP后,如果WHERE可以仅使用索引中的列来评估部分 条件,则MySQL服务器会将这部分条件压入WHERE条件下降到存储引擎。然后,存储引擎通过使用索引条目来评估推送的索引条件,并且只有在满足此条件的情况下,才从表中读取行。ICP可以减少存储引擎必须访问基表的次数以及MySQL服务器必须访问存储引擎的次数。

索引条件下推式优化的适用性取决于以下条件:

  • ICP用于 range, ref, eq_ref,和 ref_or_null访问方法时,有一个需要访问的全部表行。
  • ICP可用于InnoDB 和MyISAM表,包括分区表InnoDB和 MyISAM表。
  • 对于InnoDB表,ICP仅用于二级索引。ICP的目标是减少全行读取次数,从而减少I / O操作。对于 InnoDB聚集索引,完整的记录已被读入InnoDB 缓冲区。在这种情况下使用ICP不会减少I / O。
  • 在虚拟生成的列上创建的二级索引不支持ICP。InnoDB 支持虚拟生成的列上的二级索引。
  • 引用子查询的条件不能下推。
  • 涉及存储功能的条件不能下推。
  • 存储引擎无法调用存储的功能。
  • 触发条件不能下推。

具体的IPC相关的信息,建议参考官网

我那上面的那条sql进行个举例,说明下什么是ICP,看下图,一切都在图里。

【275期】面试官:你对MySQL中的索引了解多少?

如果表没有主键怎么办,聚集索引怎么建立

  • 默认情况下我们在设置表主键的时候,数据库会默认将其设置为聚集索引。
  • 如果没有定义主键,那么mysql会找第一个唯一索引来作为局促索引,前提是聚集索引是NOT NULL
  • 如果上面的两个条件都没有满足,那么InnoDB会生成一个隐藏的聚集索引GEN_CLUST_INDEX,每一行都生成一个默认自增的主键id。

来源:blog.csdn.net/qq_30062181/article/details/112712362

END

十期推荐

【261期】面试官:说出几个你熟悉的 Zookeeper 命令
【262期】面试官:谈谈MySQL主从复制的原理
【263期】面试最后一问:你有什么要问我的吗?
【264期】盘点MySQL主从复制,在面试中能被问什么?
【265期】面试官:为什么Integer用==比较时127相等而128不相等?
【266期】面试官:Redis主从集群切换数据丢失问题如何应对?
【267期】10道经典MySQL面试题
【268期】美团面试题:当你的JVM 堆内存溢出后,其他线程是否可继续工作?
【269期】链表高频面试题(包括反转、合并、相交、分割、环长等)
【270期】面试官:Spring的Bean实例化过程应该是怎样的?

与其在网上拼命找题? 不如马上关注我们~

【275期】面试官:你对MySQL中的索引了解多少?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/8202.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!