联系管理员

开通文章发布权限

扫码 添加微信
微信图片
电话:15897897836 QQ:2106973531

postgres中复合索引和include索引的区别

在 PostgreSQL 中,复合索引和 INCLUDE 索引是两种不同的索引类型,主要区别在于索引结构和用途。

1. 复合索引(Composite Index)

  • 定义:复合索引是基于多个列的组合创建的索引。

  • 特点

    • 索引键包含多个列的值。

    • 查询条件必须使用索引的前缀列(最左前缀原则)才能有效利用索引。

    • 索引本身可以用于查询的过滤条件(WHERE 子句)和排序(ORDER BY)。

  • 适用场景

    • 查询条件涉及多个列。

    • 需要对多个列进行排序。

  • 示例

    CREATE INDEX idx_composite ON your_table (col1, col2);

    • 以下查询可以利用复合索引:

      SELECT * FROM your_table WHERE col1 = 'value1' AND col2 = 'value2';
      SELECT * FROM your_table WHERE col1 = 'value1' ORDER BY col2;

    • 但以下查询无法充分利用复合索引(未使用最左前缀):

      SELECT * FROM your_table WHERE col2 = 'value2';


2. INCLUDE 索引(Covering Index)

  • 定义:INCLUDE 索引是一种扩展的 B-tree 索引,允许在索引中包含额外的列(非索引键列),这些列不会用于索引查找,但可以避免回表操作。

  • 特点

    • 索引键只包含查询条件中使用的列。

    • 包含列(INCLUDE 列)存储在索引的叶子节点中,不参与索引查找。

    • 适合查询只需要索引列和包含列的场景,避免访问表数据(回表)。

  • 适用场景

    • 查询只需要索引列和包含列。

    • 需要优化查询性能,减少回表操作。

  • 示例

    CREATE INDEX idx_include ON your_table (col1) INCLUDE (col2);

    • 以下查询可以利用 INCLUDE 索引:

      SELECT col1, col2 FROM your_table WHERE col1 = 'value1';

    • 由于 col2 包含在索引中,查询无需访问表数据。


3. 复合索引 vs INCLUDE 索引的区别

特性复合索引INCLUDE 索引
索引键包含多个列的值只包含查询条件中使用的列
包含列可以包含额外的列(INCLUDE 列)
索引查找索引键列参与查找只有索引键列参与查找
回表操作可能需要回表包含列在索引中,避免回表
适用场景查询条件或排序涉及多个列查询只需要索引列和包含列
最左前缀原则必须使用最左前缀列不适用
索引大小较大(包含所有索引键列)较小(只包含索引键列和包含列)

4. 如何选择

  • 使用复合索引

    • 查询条件或排序涉及多个列。

    • 需要同时优化过滤和排序。

  • 使用 INCLUDE 索引

    • 查询只需要索引列和包含列。

    • 需要避免回表操作,提升查询性能。


5. 示例对比

  • 复合索引

    CREATE INDEX idx_composite ON orders (customer_id, order_date);

    • 适合查询:

      SELECT * FROM orders WHERE customer_id = 123 AND order_date > '2023-01-01';

  • INCLUDE 索引

    CREATE INDEX idx_include ON orders (customer_id) INCLUDE (order_date);

    • 适合查询:

      SELECT customer_id, order_date FROM orders WHERE customer_id = 123;


总结

  • 复合索引适合多列查询和排序。

  • INCLUDE 索引适合避免回表操作,提升查询性能。

  • 根据查询需求选择合适的索引类型,可以有效优化数据库性能。

相关文章

从安装PostgreSQL开始
通过以下步骤,你可以在 CentOS 7 上成功安装和配置 PostgreSQL 14。首先,设置 RPM 仓库并安装 PostgreSQL 14 服务器。然后,创建自定义数据存储目录并初始化数据库。接下来,修改启动脚本以使用自定义数据存储目录,并设置 PostgreSQL 监听所有 IP 地址。为了增强安全性,配置密码认证并修改 postgres 超级用户密码。最后,确保所有配置生效,重启 PostgreSQL 服务。通过这些步骤,你将拥有一个配置良好且安全的 PostgreSQL 数据库环境。如果在过程中遇到任何问题,请参考官方文档或寻求专业支持。
checkpoint是什么东西?一个位置?还是一个操作?
checkpoint是一个操作,执行这个操作的开始时刻,会记录当前开始时刻的 WAL 位置作为重做点,这个位置会被保存在文件中。 然后将该重做点之前所有 shared buffer 中的脏页均被刷入到存储。checkpoint又名检查点,一般checkpoint会将某个时间点之前的脏数据全部刷新到磁盘,以实现数据的一致性与完整性。
PostgreSQL 内参:深入解析运行原理【快照篇】
来源于灿哥的:《PostgreSQL 内参:深入解析运行原理》,非常好的一本书。
PG存在的级联删除(ON DELETE CASCADE)
在 PostgreSQL 中,如果你有两张表:用户表(users)和订单表(orders),并且用户表的主键是订单表的外键,那么你可以通过以下步骤来进行实验,删除订单表中的一条数据,然后删除用户表中的一条数据。

评论

快捷导航

把好文章收藏到微信

打开微信,扫码查看

关闭

还没有账号?立即注册