• 索引知识总结


    一、什么是索引?

    索引是在数据库管理中一个非常重要的概念,它是一种数据结构,设计用于提高数据库查询的效率。索引类似于书籍的目录或索引页,可以帮助数据库管理系统快速定位和检索数据,而不必检查数据库中的每一行。

    以下是关于索引的一些关键点:

    1. 加速检索

      • 索引使得数据库能够快速找到存储在表中的数据,而无需扫描整个表,这在处理大型数据集时尤其重要。
    2. 数据结构

      • 索引通常基于B树或其变体(如B+树),这些结构支持高效的查找、插入和删除操作。
    3. 索引类型

      • 普通索引是最基本的索引类型,可以应用于任何列。
      • 主键索引是唯一的,每个表只能有一个,通常用于标识表中的行。
      • 唯一索引确保列中的值是唯一的,但允许NULL值的存在。
      • 全文索引用于全文搜索,适用于搜索文本中的关键词。
      • 组合索引或复合索引,涉及到多个列,可以提高涉及多列查询的性能。
    4. 维护成本

      • 虽然索引提高了读取速度,但它们增加了写入(插入、更新、删除)操作的成本,因为每次数据更改时,索引也需要更新。
      • 索引还会增加存储需求,有时索引文件可能比数据文件还要大。
    5. 索引选择

      • 数据库管理员需要仔细考虑哪些列需要索引,通常会选择那些经常在WHERE子句、JOIN条件或ORDER BY子句中使用的列。
      • 过多的索引可能会降低整体性能,因此需要平衡索引的数量和类型以达到最佳性能。
    6. 索引维护

      • 定期分析和优化索引,删除不再需要的索引,可以节省存储空间并提高性能。

    总的来说,索引是提高数据库性能的关键工具,但需要谨慎使用,以避免不必要的开销。

    二、如何使用索引

    在数据库中使用索引主要涉及两个方面:创建索引和利用索引进行查询优化。以下是如何在这两方面使用索引的详细步骤:

    创建索引

    1. 确定索引列:选择那些经常出现在WHERE子句、JOIN条件或ORDER BY子句中的列作为索引的目标。确保这些列的值具有足够的选择性(即,列值分布广泛,不重复或很少重复)。

    2. 选择索引类型:根据需要选择合适的索引类型,例如:

      • 普通索引(INDEX):最常用的索引类型,没有特殊限制。
      • 唯一索引(UNIQUE INDEX):索引列的值必须唯一,但允许一个NULL值。
      • 主键索引(PRIMARY KEY):一种唯一索引,每张表只能有一个,且不允许NULL值。
      • 全文索引(FULLTEXT INDEX):专门用于全文搜索,适用于CHARVARCHARTEXT类型的列。
      • 复合索引(COMPOSITE INDEX):涉及多个列的索引。
    3. 创建索引:使用CREATE INDEX语句或者在ALTER TABLE语句中添加ADD INDEXADD UNIQUE子句来创建索引。例如,在MySQL中,你可以这样创建索引:

       Sql 

      深色版本

      1CREATE INDEX idx_column_name ON table_name (column_name);

    利用索引进行查询优化

    1. 编写使用索引的查询:确保你的SQL查询语句能够有效地利用索引。例如,使用=运算符而不是LIKE(除非你确信它不会导致前缀匹配问题)。

    2. 避免索引选择性降低:不要在索引列上使用函数或表达式,因为这会导致数据库无法使用索引。

    3. 使用覆盖索引:当查询只需要索引中包含的列时,数据库可以直接从索引中获取数据,而不需要访问实际的表,这被称为“覆盖索引”。

    4. 索引统计信息:定期运行ANALYZE TABLEUPDATE INDEXES命令,以更新索引的统计信息,帮助数据库优化器做出更好的决策。

    5. 使用EXPLAIN计划:使用EXPLAIN语句分析你的查询,了解数据库如何使用索引,以及是否可以进一步优化。

    6. 监控性能:定期检查慢查询日志,分析哪些查询可能因为缺少适当的索引而表现不佳。

    记住,虽然索引可以显著提升查询性能,但它们也会增加写操作(如插入、更新和删除)的成本,并占用额外的存储空间。因此,创建索引时应权衡这些因素,并适时地维护和调整索引策略。

    三、使用索引需要注意什么(索引失效的场景)

    索引失效是指数据库在执行查询时,由于某些特定条件或操作的存在,原本应该用于加速数据检索的索引不能被有效利用的情况。这通常会导致查询性能下降,因为数据库系统不得不执行全表扫描(table scan)或全索引扫描(index scan),而非仅访问索引中必要的部分。以下是一些常见的索引失效场景:

    1. 联合索引非最左匹配

      • 当使用联合索引(由多个列组成的索引)时,如果查询条件没有遵循最左前缀原则(即从联合索引的第一个列开始),则索引可能无法被充分利用。
    2. 模糊查询

      • 特别是使用LIKE操作符进行左模糊匹配(如LIKE '%abc')或左右模糊匹配(如LIKE '%abc%')时,索引通常无法被使用,因为B树索引结构无法有效地支持这种模式的搜索。
    3. 对索引列使用函数

      • 如果查询条件中对索引列使用了函数,如UPPER()LENGTH()SUBSTRING()NOW(), 等,索引将无法直接应用,因为索引存储的是原始列值。
    4. 数据类型不匹配

      • 如果查询条件中使用的值与索引列的数据类型不匹配,数据库可能无法使用该索引。
    5. 使用SELECT *

      • 虽然这不是直接导致索引失效的原因,但在查询中使用SELECT *而不是具体列名可能会导致数据库无法使用覆盖索引,从而降低性能。
    6. 索引列参与运算

      • 如果索引列在查询条件中参与了数学运算或其他类型的运算,索引可能无法被使用。
    7. OR操作

      • 如果OR操作连接的条件中至少有一个没有索引,或者索引列不同,那么索引可能失效,尤其是在OR条件下的列没有共同的索引时。
    8. 查询返回大量数据

      • 当查询返回的数据量接近表的总大小时,数据库优化器可能决定全表扫描比使用索引更高效。
    9. 索引本身的问题

      • 如索引碎片化、统计信息过时等,这些问题可能导致数据库优化器错误地判断索引的使用效益。
    10. 字符集不一致

      • 在进行字符串比较时,如果字符集设置不一致,也可能导致索引失效。

    为了避免索引失效,数据库管理员和开发人员应当熟悉这些场景,并在设计和编写查询时考虑到索引的有效使用,同时定期维护和优化索引。

  • 相关阅读:
    metinfo 6.0.0 任意文件读取漏洞复现
    C++11(二)右值引用与移动语义+完美转发
    C++:websocketpp使用
    Spring - 全局异常处理器的使用
    蓝牙 - 注册SIG账号
    【C语言】内存函数的详细教学和模拟实现
    【Proteus仿真】【STM32单片机】汽车倒车报警系统设计
    七日杀Liunx SteamCMD开服超详细教程及服务器配置需求
    Pandas 数据中的loc与iloc含义以及操作
    Erlang 入门——从普通tcp到OTP框架通信
  • 原文地址:https://blog.csdn.net/qq_38599266/article/details/140306409