数据库中的索引

1.索引的定义

数据库中的索引是一种数据结构,类似于书籍的目录,旨在提高查询效率。

2.索引的选择

索引既然是一种数据结构,那么他使用了哪种数据结构作为底层原理?

(1)索引为什么不用哈希表?

哈希表的查询效率不是O(1)吗?为什么不使用哈希表来作为索引?这样查询效率不是很高吗?

1).哈希表适合等值查询,不支持范围查询,如>、<、group by等

2).在数据量过大的情况下,哈希冲突会使得哈希表的查询时间增加,最坏情况下时间复杂度退化成O(n)

3).哈希表存储的数据是无序的,而数据库中经常要求通过group by或者order by等条件进行排序。

4).复合索引在哈希表中无法使用。

(2)索引为什么不用二叉搜索树?

二叉搜索树的时间复杂度虽然为N(logN),但是存在致命缺陷:

1).二叉搜索树会在特殊情况下退化成单边搜索树,时间复杂度退化为O(N)。

2).二叉搜索树无法保证树的高度,搜索时父亲节点到孩子节点会发生一次磁盘I/O,二叉搜索树有可能会导致树的高度很高磁盘I/O次数很多,性能也就随之变差

(3)为什么不用N叉树?

N叉树相比于哈希表和二叉搜索树来说:

1).度为N,每个父亲节点都有N个孩子,有效地降低了树的高度,也就避免二叉搜索中因为树的高度变大导致磁盘I/O次数变多、性能变差。这有效地提升了查询效率。

2).支持范围查询

但是数据库认为N叉搜索树做的还不够好,所以并没有采用这种数据结构来作为索引的底层原理。

(4)用B+树来作为索引结构

B+树的优点:

1).在一棵树种,查询每个节点所需要的时间复杂度都相等。插入和删除有较稳定的时间复杂度。

2).非叶子节点仅作为索引,所有的真实数据均存储于叶子结点之中

3).叶子节点是一条双向链表,按照Key值排列,保证了数据的稳定有序,并且方便查询兄弟节点

3.面试题

(1).B+树相对于B树有什么优点?

B树:

B+树:

1) B+树的叶子节点之间是通过双向链表链接,并且按照Key值排列,数据更为有序,查找更为方便。

2)B+树的非叶子节点仅作为索引,所有的真实数据均保存于叶子结点之中。相对于B树而言,B+树查询每一个节点的时间复杂度均相等,性能更均衡

(2)索引不适用于什么情况?

索引在提升数据库查询性能方面效果显著,但并非在所有情形下都适用。以下为你详细介绍不适合使用索引的情况:

数据区分度低的列

  • 原理:索引的作用是通过快速定位来减少数据扫描量。若列的数据区分度低,即列中存在大量重复值,索引就难以有效发挥作用。因为在查找特定值时,需要扫描大量相同值的记录,无法显著减少扫描范围。
  • 示例:在员工表中,若有 “性别” 列,其值只有 “男” 和 “女” 两种,为该列创建索引后,查询时依然要扫描大量记录,索引带来的性能提升十分有限。

频繁更新的列

  • 原理:当对表中的数据进行更新操作时,数据库不仅要更新数据本身,还需更新相关的索引。若列频繁更新,会导致大量的索引维护操作,这会消耗大量的系统资源,降低数据库的整体性能。
  • 示例:在一个实时交易表中,“交易金额” 列会随着交易的进行频繁更新。若为该列创建索引,每次更新交易金额时,都要更新索引,这会增加数据库的负担。

小表数据

  • 原理:对于数据量较小的表,全表扫描的开销相对较小。此时使用索引可能会引入额外的索引查找开销,反而会降低查询性能。
  • 示例:一个只有几十条记录的部门表,进行查询时直接全表扫描的速度可能比使用索引更快。

包含函数或表达式的查询条件

  • 原理:若查询条件中对索引列使用了函数或表达式,数据库无法直接使用索引进行查找,通常会进行全表扫描。因为函数或表达式的计算结果需要在查询执行时动态生成,无法利用索引的有序性进行快速定位。
  • 示例:在查询语句 SELECT * FROM users WHERE YEAR(create_time) = 2024; 中,对 create_time 列使用了 YEAR 函数,这会使索引失效。

全文搜索场景

  • 原理:普通索引主要适用于精确匹配或范围查询,对于全文搜索,如查找包含特定关键词的文本内容,普通索引无法高效处理。因为全文搜索需要对文本进行分词、匹配等复杂操作,普通索引的结构无法满足这些需求。
  • 示例:在一个新闻文章表中,要搜索包含 “人工智能” 关键词的文章,使用普通索引无法快速定位到相关文章,需要使用专门的全文索引。

选择性差的复合索引

  • 原理:复合索引是基于多个列创建的索引。若复合索引中某些列的选择性较差,即这些列的值重复度较高,会影响整个复合索引的性能。因为在使用复合索引时,数据库需要同时考虑多个列的值,选择性差的列会导致索引的效率降低。
  • 示例:创建了一个复合索引 (department_id, gender),若 gender 列的区分度很低,在查询时使用该复合索引可能无法有效减少扫描范围。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值