数据库 200309

1. 索引是什么?是如何实现的?

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

B树的定义:

  • 根节点至少有 2 个孩子,至多有 m 个孩子。

  • 除了根节点以外,所有内部节点至少有 m/ 2(向上取整)个孩子,至多有 m 个孩子。

  • 节点内部关键字 = 孩子数 - 1,并且内部关键字是有序的。

  • 所有外部节点位于同一层上。

B树和B+树区别:

  • B 树,每个节点都存储 key 和 data,所有节点组成这棵树,并且叶子节点指针为 null,叶子结点不包含任何关键字信息。

  • B + 树,所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接,所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。(而 B 树的非终节点也包含需要查找的有效信息)

  • Hash 索引无法范围查询,无法模糊查询,无法排序操作,不支持联合索引最左匹配,无法避免表扫描。但是等值查询具有极高效率。


2. 索引的分类?索引失效条件?

分类:

  • 主键索引 (PRIMARY KEY)
  • 唯一索引 (UNIQUE)
  • 普通索引 (INDEX)
  • 组合索引 (INDEX)
  • 全文索引 (FULLTEXT)

索引失效条件:

  • 在 where 子句中使用!= 或 <> 操作符

  • 在 where 子句中使用 or 来连接条件,当连接的字段有字段没有索引时,将导致所有字段的索引失效

  • 在 where 子句字段进行 null 值判断,

  • 在 where 子句中 like 的模糊匹配以 % 开头

  • 在 where 子句中对有索引的字段进行表达式或函数操作

  • 如果执行引擎估计使用全表扫描要比使用索引快,则不使用索引


3. 索引优化方式?

创建:

  • 在经常需要搜索的列上,可以加快搜索的速度;

  • 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;

  • 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;

  • 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;

  • 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;

  • 在经常使用在 WHERE 子句中的列上面创建索引,加快条件的判断速度。

避免创建:

  • 对于那些在查询中很少使用或者参考的列不应该创建索引。

  • 对于那些只有很少数据值的列也不应该增加索引。

  • 对于那些定义为 text, image 和 bit 这种数据量很大的数据类型的列不应该增加索引。

  • 当修改性能远远大于检索性能时,不应该创建索引


4. 怎么验证 mysql 的索引是否满足需求?

用数据库再带的命令 explain查看语句中索引是否启动,

  • type: 主要衡量该检索的性能(all 代表全表扫描,index 代表全索引)

  • key: 显示 Mysql 实际决定使用的键(索引),null 代表未走索引。


5. 索引的底层结构是什么?说说各种的特点和缺点?

  • 索引的底层结构是B 树、B + 树和 hash 结构。

B树的定义:

  • 根节点至少有 2 个孩子,至多有 m 个孩子。

  • 除了根节点以外,所有内部节点至少有 m/ 2(向上取整)个孩子,至多有 m 个孩子。

  • 节点内部关键字 = 孩子数 - 1,并且内部关键字是有序的。

  • 所有外部节点位于同一层上。

B树和B+树区别:

  • B 树,每个节点都存储 key 和 data,所有节点组成这棵树,并且叶子节点指针为 null,叶子结点不包含任何关键字信息。

  • B + 树,所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接,所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。(而 B 树的非终节点也包含需要查找的有效信息)

  • Hash 索引无法范围查询,无法模糊查询,无法排序操作,不支持联合索引最左匹配,无法避免表扫描。但是等值查询具有极高效率。

  • B + 的磁盘读写代价更低,B+tree 的查询效率更加稳定


【Java 面试那点事】

这里致力于分享 Java 面试路上的各种知识,无论是技术还是经验,你需要的这里都有!

这里可以让你【快速了解 Java 相关知识】,并且【短时间在面试方面有跨越式提升】

面试路上,你不孤单!
在这里插入图片描述

发布了196 篇原创文章 · 获赞 878 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/qq_33945246/article/details/104720734