索引(复习篇)

一、前言

1、什么是索引

  • 索引是数据库中用于提高数据检索效率的数据结构。它类似于书籍的目录,可以快速定位和访问存储在数据库表中的数据。

  • 索引通过建立某个列或列组合的值与数据行之间的对应关系,以提供高效的数据查找和排序。当执行查询语句时,数据库引擎可以使用索引来快速定位满足查询条件的数据,避免全表扫描,减少了查询的时间复杂度和资源消耗。

  • 然而,索引的创建和维护会占用额外的存储空间,并对插入、更新和删除操作产生一定的影响。因此,索引的设计和使用需要谨慎考虑,避免过多或不必要的索引,以充分发挥索引的优势同时保持数据库的整体性能。

  • 总之,索引是数据库中的一种数据结构,用于加速数据的查找、排序和访问操作,提高数据库的查询效率和性能。

2、索引的重要性和作用

  1. 提高数据检索效率:索引能够快速定位满足查询条件的数据,避免全表扫描,大幅提高数据的检索效率和响应速度。
  2. 加速排序操作:索引可以按照指定的列值进行排序,使得排序操作更加高效,特别是在处理大量数据或复杂排序需求时,显著减少排序时间。
  3. 优化查询性能:通过使用索引,可以减少查询所需的磁盘I/O操作,从而提高查询性能,减少资源消耗,提升用户体验。
  4. 支持快速范围查询:索引使得范围查询操作更加高效,例如在某个日期范围内查询记录或者根据某个条件获取一定范围的数据。
  5. 提供唯一性约束和数据完整性:唯一索引可以确保索引列中的值是唯一的,避免数据的重复插入,确保数据的完整性和一致性。
  6. 支持连接操作和关联查询:通过建立关联关系的索引,可以加速连接操作和关联查询,提高多表查询的效率。
  7. 减少数据存储空间的占用:索引仅存储列值和指针信息,相对于完整存储数据,索引占用的存储空间更小,节省了存储资源。

二、索引结构和索引类型

以前在学习的时候,总分不清楚主键索引、唯一索引和B-Tree索引等,一头雾水就含糊过去了,索引也区分为索引的结构和索引的类型。下面就来了解一下它们的区别。

2.1、索引结构

索引结构指的是在数据库中用于实现索引的底层数据结构。它决定了索引在存储和组织数据时的方式,以支持快速的数据检索和查询操作。

常见的索引结构

  1. B-Tree(B树):B-Tree是一种自平衡的树状数据结构,适用于范围查询、等值查询和排序操作。它被广泛应用于数据库管理系统中,用于实现索引。

  2. B+Tree(B+树):B+Tree是基于B-Tree的改进版本,将数据仅存储在叶子节点中,使得范围查询和顺序访问更高效。

  3. 哈希表:哈希表使用哈希函数将键值映射到唯一的索引桶中,实现了常数时间复杂度的等值查找。哈希表适用于快速的精确匹配查询。

  4. 倒排索引:倒排索引适用于全文搜索场景,将文档中的词语映射到包含该词语的文档列表中。它用于高效地支持关键字搜索、模糊匹配和排序。

  5. R-Tree(R树):R-Tree是一种用于空间数据的索引结构,用于支持空间范围查询和空间关系操作。它常用于地理信息系统和空间数据库中。

2.2、索引类型

索引类型指的是在数据库中创建索引时所使用的具体类型或属性,用于定义索引的行为和约束。索引类型决定了索引的功能和用途。

常见的索引类型

  1. 唯一索引(Unique Index):唯一索引要求索引列的值是唯一的,不允许重复值的存在。它可以用于加速对唯一性约束的检查和避免插入重复数据。
  2. 主键索引(Primary Key Index):主键索引是一种特殊的唯一索引,用于标识表中的唯一记录。每个表只能有一个主键索引,并且主键索引通常与表的主键约束相关联。
  3. 普通索引(Normal Index):普通索引是最常见的索引类型,它用于提高特定列的查询性能。普通索引可以加速等值查询、范围查询和排序操作。
  4. 全文索引(Full-Text Index):全文索引用于在文本字段中进行全文搜索和匹配。它支持关键字搜索、模糊匹配和排序,适用于处理自然语言文本的搜索需求。
  5. 空间索引(Spatial Index):空间索引用于优化地理数据和几何对象的空间查询。它支持空间关系操作和空间范围查询,常用于地理信息系统和空间数据的存储与查询。

三、索引的一些要点

3.1、B树和B+树的区别

  1. B树的数据是存储在所有节点上的
  2. B+树只将数据存储在叶子节点,非叶子节点存储索引键值
  3. B+树的所有数据都存储在叶子节点上
  4. B+树的每个叶子节点使用了双向链表,这就让范围查找,排序查找,分组查找以及去重查找变得异常简单

3.2、索引的优缺点

优点

  1. 快速数据检索:索引可以加快数据库查询的速度,特别是在大型表或频繁查询的情况下。通过索引,数据库可以更快地定位和访问所需的数据行,减少了全表扫描的需求。
  2. 提高查询性能:索引可以优化查询操作,包括等值查询、范围查询和排序操作。通过使用索引,查询语句可以更有效地定位和过滤数据,提高查询的响应时间和性能。
  3. 加速数据排序:索引可以加速数据的排序操作。当查询需要按特定列排序时,索引可以直接提供有序的数据行,避免了对整个表进行排序的开销。
  4. 唯一性约束和数据完整性:索引可以用于实施唯一性约束,确保列或组合列的值是唯一的。它们可以保证数据的完整性,防止重复或不一致的数据出现。
  5. 提高并发性能:通过减少数据访问的成本,索引可以提高数据库的并发性能。多个查询可以同时访问不同的索引,而不会互相干扰。

缺点

  1. 占用存储空间:索引需要占用额外的存储空间,以存储索引结构和索引列的值。对于大型表和多个索引的情况,索引可能占用相当大的存储空间。
  2. 索引维护成本:在插入、更新和删除数据时,索引需要进行相应的维护操作,以保持索引的一致性和有效性。这些维护操作可能会增加数据写入的开销。
  3. 索引更新开销:当表中的数据发生变化时,索引需要进行更新以反映最新的数据状态。对于频繁更新的表,索引的更新开销可能会影响写入性能。
  4. 增加查询计划复杂性:当表中存在多个索引时,数据库优化器需要选择合适的索引来执行查询。复杂的查询语句可能会导致选择正确索引的困难,影响查询计划的优化和性能。

3.3、什么情况下不适合使用索引

  1. 小型表:对于非常小的表,使用索引可能不会带来明显的性能提升。因为索引本身也需要占用一定的存储空间,并且在查询过程中需要进行额外的索引查找操作。
  2. 高度动态的表:如果表的数据频繁更新、插入和删除,而且查询操作比较少,过多的索引可能会增加维护成本和降低写入性能。因为在更新数据时,除了更新表本身,还需要维护相应的索引结构。
  3. 查询涉及大部分或全部数据:如果查询涉及到大部分或全部数据的情况,使用索引可能不会带来明显的性能提升。因为数据库引擎可能会选择全表扫描而不是使用索引,以避免频繁的索引查找操作。
  4. 查询使用了函数或表达式:如果查询中使用了函数或复杂的表达式,索引可能无法直接匹配查询条件,无法发挥预期的优化效果。
  5. 高并发的写入操作:在高并发的写入场景下,频繁的索引维护可能会导致锁竞争和性能下降。在此情况下,减少索引数量或选择合适的索引策略可能更加合适。
  6. 非常低选择性的列:如果索引列的选择性非常低,即具有大量重复值,使用索引可能不会带来明显的性能提升。因为索引的选择性决定了它在查找过程中过滤数据的能力。
  7. 临时表或历史数据表:对于一些临时表或历史数据表,查询需求较少且数据稀疏,使用索引的收益可能较小,可以考虑不创建索引或选择更少的索引。

四、优化

4.1、杜绝使用SELECT *

  • 在表查询中,一律不要使用*作为查询的字段列表,需要哪些字段必须明确写明
  • select*走全表扫描,没有用到任何索引,查询效率非常低
  • select*查询一般不走覆盖索引,所以会产生大量的回表查询
  • 在实际应用中通常只需要使用几个字段,其他不需要的字段查出来会浪费CPU、内存资源的消耗

4.2、小表驱动大表

  • 在连接表的时候,两张表的数据少和多区别为小表和大表
  • 当查询的时候因当使用小表连接大表,从而减少数据的计算量,提高查询效率。

4.3、提升Group by的效率

  • 如果group by查询的列没有使用索引,那么可能查询会变得很慢
  • 在group by查询的列添加索引,可以加速查询的效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值