数据库 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 相关知识】,并且【短时间在面试方面有跨越式提升】
面试路上,你不孤单!