PostgreSQL之INDEX 索引

本文介绍了PostgreSQL中索引的作用、创建与删除方法,强调了索引能提升检索速度并保证数据唯一性,但也指出索引会占用空间并影响数据维护速度。文章还提供了创建和避免创建索引的准则,帮助优化数据库性能。
部署运行你感兴趣的模型镜像

之前总结了PostgreSQL的序列相关知识,今天总结下索引。
我们都知道,数据库索引最主要的作用是可以提高检索数据的速度,但是索引也不是越多越好。因为索引会增加数据库的存储空间,查询数据是要花较多的时间。

1、创建索引
SQL语句如下:

CREATE INDEX idx_commodity
  ON commodity   //表名
  USING btree     //用B树实现
  (commodity_id);  //作用的具体列

2、删除索引
DROP index idx_commodity;

3、增加索引的优势:
创建索引可以大大提高系统的性能。
第一,最主要的原因是可以大大加快数据的检索速度;
第二,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性;
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义;
第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间;
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

4、增加索引的劣势:
第一,创建索引和维护索引要花费时间,且随着数据量的增加时间也会增加;
第二,索引会占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间;’
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

5、索引的选择
一般来说,应该在这些列上创建索引:
第一、 在经常需要搜索的列上,可以加快搜索的速度;
第二、 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
第三、 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
第四、 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
第五、 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
第六、 在WHERE子句的列上面创建索引,加快条件的判断速度。

一般来说,不应该创建索引的的这些列具有下列特点:
第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。

本文内容部分参考:http://blog.youkuaiyun.com/kennyrose/article/details/7532032/

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### PostgreSQL 中联合索引的创建与最佳实践 #### 联合索引的概念 联合索引是指在一个表上基于多个列创建的单一索引。它能够显著提升涉及这些列组合查询的性能,尤其是在 WHERE 子句中经常一起使用的字段。 #### 创建联合索引的语法 以下是创建联合索引的标准 SQL 语句: ```sql CREATE INDEX index_name ON table_name (column1, column2, ...); ``` 例如,在 `orders` 表上的 `(customer_id, order_date)` 列创建联合索引可以这样实现: ```sql CREATE INDEX idx_customer_orderdate ON orders (customer_id, order_date); ``` 此索引适用于如下类型的查询条件: - 单独按 `customer_id` 查询; - 同时按 `customer_id` 和 `order_date` 查询; 但不适用于单独按 `order_date` 的查询[^1]。 #### 联合索引的设计原则 1. **顺序的重要性**:联合索引中的列顺序至关重要。通常应将过滤性更强的列放在前面,以便更早地减少结果集大小。 2. **覆盖索引**:如果可能,设计联合索引使其能完全满足某些查询的需求(即查询所需的所有列都在索引中),从而避免回表操作。 3. **避免过度索引**:过多的索引会增加写入成本以及存储开销,需权衡读写需求来决定是否创建联合索引。 #### 使用场景举例 假设有一个频繁运行的查询如下所示: ```sql SELECT product_id, quantity FROM sales WHERE customer_region = 'North' AND sale_date >= '2023-01-01'; ``` 针对该查询可考虑创建以下联合索引: ```sql CREATE INDEX idx_sales_region_date ON sales(customer_region, sale_date); ``` 这不仅有助于加速上述特定查询,还支持其他类似的复合条件筛选情况[^2]。 #### 性能优化建议 为了进一步发挥联合索引的作用,还可以调整一些系统配置参数以改善整体表现,比如增大缓存池容量等设置: ```plaintext shared_buffers = 8GB work_mem = 64MB effective_cache_size = 16GB ``` 通过合理规划和运用联合索引技术,可以在很大程度上增强 PostgreSQL 数据库应用层面上的数据检索效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值