PostgreSQL

PostgreSQL 知识量:10 - 51 - 182

6.1 索引简介><

索引的含义和作用- 6.1.1 -

索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。它是针对表而建立的,由数据页面以外的索引页面组成,每个索引页面中的行都会含有逻辑指针,以便加速检索物理数据。

在数据库系统中建立索引主要有以下作用:

  • 快速取数据:索引提供指向存储在表的指定列中的数据值的指针,然后根据指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后通过这些指针快速找到包含该值的行,从而加快对表中数据的检索速度。

  • 保证数据记录的唯一性:索引可以保证数据的唯一性,即每个索引值对应唯一的数据记录。通过唯一索引,可以快速地检索和定位具有唯一标识的数据行。

  • 实现表与表之间的参照完整性:索引可以帮助实现表与表之间的参照完整性。通过在相关联的表上建立索引,可以确保引用完整性,即在一个表中引用另一个表的数据时,确保引用的数据是有效的。

  • 在使用ORDER by、group by子句进行数据检索时,利用索引可以减少排序和分组的时间。索引已经对数据进行了排序,因此在使用这些子句时,可以直接利用索引的排序结果,避免了对数据的重新排序操作。

索引的分类- 6.1.2 -

在 PostgreSQL 中,索引的分类主要有以下几种:

  • B-tree 索引:这是 PostgreSQL 的默认索引类型。B-tree 索引能够支持大部分的查询操作,包括等于、不等于、大于、小于等条件查询。

  • Hash 索引:Hash 索引适用于等值查询,但不支持范围查询。由于其基于哈希表,所以对于等值查询非常高效。但是,Hash 索引不支持多列索引和排序操作。

  • GiST (Generalized Search Tree):GiST 是一种扩展的索引类型,支持对非标准数据类型的索引,如数组、全文搜索、空间数据等。GiST 提供了基于空间的索引,适用于空间数据和范围查询。

  • SP-GiST (Space-Partitioned Generalized Search Tree):SP-GiST 是 GiST 的一个变种,特别适用于需要处理大量数据和高度变化的场景。

  • BRIN (Block Range Index):BRIN 索引主要用于处理大量连续的数据块。它通过减少存储空间和提高查询性能来优化大数据量的范围查询。

  • Bitmap 索引:Bitmap 索引适用于具有少量唯一值的列。它通过位图的方式存储索引,可以快速判断某个值是否存在。但是,Bitmap 索引不适合包含大量唯一值的列,因为每个唯一值都需要一个位图,导致存储空间较大。

  • Function-based indexes:这种索引基于函数的计算结果来创建索引。例如,可以基于一个日期函数或字符串函数创建索引。

  • Partial indexes:Partial 索引允许只对表中的一部分数据创建索引。这种索引对于大型表特别有用,因为它可以减少索引的大小和查询时间。

  • Expression-based indexes:表达式索引允许基于列的表达式创建索引,而不是直接基于列的值。这可以用于创建基于计算结果的索引,或者用于提高特定查询的性能。

  • Multicolumn indexes:多列索引允许在多个列上创建一个联合索引。这种索引对于那些经常一起被查询的列特别有用。

  • Text search indexes:文本搜索索引用于加速文本搜索查询。PostgreSQL 提供了一个扩展叫做 tsearch2,后来被 tsearch2 和 pg_trgm 替代,用于文本搜索和模糊查询。

这些是 PostgreSQL 支持的主要索引类型,每种类型都有其适用的场景和优缺点。选择合适的索引类型取决于查询需求、数据量、数据分布等因素。

索引的设计原则- 6.1.3 -

索引的设计原则主要包括以下几点:

  • 选择性原则:选择具有高选择性的列作为索引,以提高使用索引的效率。选择性是指唯一值与总行数之比,选择性的值越高,使用索引的效率越高。

  • 针对性原则:针对数据量较大且查询频繁的表建立索引。对于经常作为查询条件、排序和分组操作的字段建立索引,以提高查询性能。

  • 前缀原则:如果某个字段的长度较长,可以考虑建立前缀索引,以节省存储空间。

  • 联合索引原则:尽量使用联合索引,减少单列索引。联合索引可以覆盖多个列,减少存储空间的使用,提高查询效率。

  • 维护原则:控制索引的数量,过多的索引会影响增删改的效率。同时,要定期维护和重建索引,以保证其性能。

  • 使用覆盖索引:如果查询只涉及到索引中的信息,则可以直接通过索引返回结果,而不需要回表查找,从而提高查询效率。

  • 避免过度索引:索引需要额外的磁盘空间,并降低写操作的性能。因此,不要在每个字段上都建立索引。

  • 考虑查询优化器:查询优化器知道哪些索引最有效地用于查询。因此,在创建表时,应尽量满足查询优化器的需求。

  • 主键原则:对于 InnoDB 存储引擎的表,记录默认会按照一定的顺序保存。如果有明确定义的主键,则按照主键顺序保存。如果没有明确定义的主键,则可以创建一个组合索引作为主键。

  • 外键原则:定义有外键的数据列一定要建立索引。

  • 更新频率原则:对于更新频繁的字段,不适合创建索引。因为每次更新操作都需要维护索引结构,这会增加写操作的性能开销。

  • 大文本和大对象原则:大文本和大对象字段不适合创建索引,因为它们本身就占据了大量空间,而创建索引又需要额外的空间。