首页 > 数据库 >PostgreSQL索引分类

PostgreSQL索引分类

时间:2023-08-11 14:57:26浏览次数:61  
标签:PostgreSQL CREATE 分类 order 索引 VALUES date id

PostgreSQ 支持空间和倒排索引

  • 普通索引
    • 也就是二级索引 索引和数据是分开存储的
    • 索引查找数据即需要访问索引,又需要访问表,而表的访问是随机 I/O。
    • 查询效率 o(nlog(n))
  • 哈希索引
    • 只能用用于 == 查看
    • 查询效率 o(1)
  • 通用搜索树(Generalized Search Tree)GiST
  • R 树(radix tree)结构用于空间 区域 间距
  • 查询效率 O(k)(k为字符串集合中最长的字符串长度)
  • SP-GiST 索引
  • SP-GiST 代表空间分区 GiST,
  • 主要用于 GIS、多媒体、电话路由以及 IP 路由等数据的索引
  • 查询效率 O(k)
  • GIN 索引
  • 代表广义倒排索引(generalized inverted indexes) 用于搜索
  • 可以用于 hstore、array、jsonb 以及 range 数据类型
  • 查询效率 O(1)
  • BRIN 索引
  • 代表块区间索引(block range indexes)
  • 存储了连续物理范围区间内的数据摘要信息
  • 查询效率 O(nlog(n)B+ Tree)
  • 唯一索引
  • 多列索引
  • 函数索引
  • 部分索引
  • 覆盖索引

普通索引的 示例

CREATE TABLE test (
  id integer,
  name text
);

insert into test
select v,'val:'||v from generate_series(1, 10000000) v;

# 没有索引
explain analyze
SELECT name FROM test WHERE id = 10000;
QUERY PLAN 


#####  全表 Seq Scan on Execution Time
Seq Scan on test  (cost=10000000000.00..10000179055.00 rows=1 width=11) (actual time=4.174..922.096 rows=1 loops=1)
  Filter: (id = 10000)
  Rows Removed by Filter: 9999999
Planning Time: 3.370 ms
Execution Time: 922.213 ms   

# 加入索引

CREATE INDEX test_id_index ON test (id);

##### 使用索引 Index Scan  Execution Time
Index Scan using test_id_index on test  (cost=0.43..8.45 rows=1 width=11) (actual time=5.917..5.920 rows=1 loops=1)
  Index Cond: (id = 10000)
Planning Time: 25.992 ms
Execution Time: 9.869 ms

空间索引示例

create table points(p point);

create index on points using gist(p);

insert into points(p) values
  (point '(1,1)'), (point '(3,2)'), (point '(6,3)'),
  (point '(5,5)'), (point '(7,8)'), (point '(8,6)');
	
# 矩形有区域的内的点
 select * from points where p <@ box '(2,1),(7,4)';
 
### 最近的两个点
 select * from points order by p <-> point '(4,7)' limit 2;


#### ip 查询
CREATE TABLE ip_addresses (
    id SERIAL PRIMARY KEY,
    ip_range inet
);

INSERT INTO ip_addresses (ip_range) VALUES
('192.168.0.0/16'),
('10.0.0.0/8'),
('172.16.0.0/12');

### 开启拓展
psql postgres
CREATE EXTENSION btree_gist;

CREATE INDEX ip_range_idx ON ip_addresses USING spgist(ip_range inet_ops);
## 范围查询
SELECT *
FROM ip_addresses
WHERE ip_range >>= '192.168.100.0/24';

           

覆盖索引示例

CREATE TABLE orders (id SERIAL PRIMARY KEY, customer_id INT, order_date DATE, total_amount FLOAT);
INSERT INTO orders (customer_id, order_date, total_amount) VALUES (1001, '2023-01-01', 150.00);
INSERT INTO orders (customer_id, order_date, total_amount) VALUES (1002, '2023-01-02', 200.00);
INSERT INTO orders (customer_id, order_date, total_amount) VALUES (1001, '2023-01-03', 100.00);


CREATE INDEX covering_index ON orders (customer_id) INCLUDE (order_date, total_amount);


SELECT order_date, total_amount FROM orders WHERE customer_id = 1001;

块范围索引 示例

CREATE TABLE sales (id SERIAL PRIMARY KEY, order_date DATE);
INSERT INTO sales (order_date) VALUES ('2023-01-01');
INSERT INTO sales (order_date) VALUES ('2023-02-01');
INSERT INTO sales (order_date) VALUES ('2023-03-01');

CREATE INDEX brin_index ON sales USING BRIN (order_date);

CREATE INDEX brin_index ON sales USING BRIN (order_date);

倒排索引 示例

CREATE TABLE books (id SERIAL PRIMARY KEY, title TEXT);
INSERT INTO books (title) VALUES ('Harry Potter and the Sorcerer''s Stone');
INSERT INTO books (title) VALUES ('The Great Gatsby');
INSERT INTO books (title) VALUES ('To Kill a Mockingbird');


CREATE INDEX gin_index ON books USING GIN (to_tsvector('english', title));

SELECT * FROM books WHERE to_tsvector('english', title) @@ to_tsquery('english', 'Potter');


部分索引 示例

CREATE TABLE t (a int, b int, c int);

#  基于字段 a 和 b 创建了多列索引,同时利用INCLUDE在索引的叶子节点存储了字段 c 的值
CREATE UNIQUE INDEX idx_t_ab ON t USING btree (a, b) INCLUDE (c);
insert into t 
select v,v+100,v+200 from generate_series(1, 10000000) v;

### 查询
explain analyze
select a, b, c 
from t 
where a = 100 and b = 200;
QUERY PLAN  

#### 
Index Only Scan using idx_t_ab on t  (cost=0.43..4.45 rows=1 width=12) (actual time=0.389..0.391 rows=1 loops=1)
  Index Cond: ((a = 100) AND (b = 200))
  Heap Fetches: 0
Planning Time: 5.027 ms
Execution Time: 0.949 ms         

标签:PostgreSQL,CREATE,分类,order,索引,VALUES,date,id
From: https://www.cnblogs.com/guanchaoguo/p/17622605.html

相关文章

  • PostgreSQL autovacuum 5 怎么监控(autovacuum 扫描表工作的百分比)
    PostgreSQL最大的问题就是vacuum,只要PG的实现多版本和UNDO的方式不改变,那么这个话题就会一直继续,到永远。前面四期讲了autovacuum的触发条件,源代码,怎么调整参数,优化,今天最后一章,的说说怎么进行监控,并且评定你的autovacuum的工作是合格的。下面的内容主要是基于几点来围绕的监......
  • PostgreSQL 查看表膨胀与索引膨胀 SQL
    查看表膨胀TOP5SELECTcurrent_database()ASdb,schemaname,tablename,reltuples::bigintAStups,relpages::bigintASpages,otta,ROUND(CASEWHENotta=0ORsml.relpages=0ORsml.relpages=ottaTHEN0.0ELSEsml.relpages/otta::numericEND,1)AStbloat,CASE......
  • pg_table_size,pg_relation_size和pg_total_relation_size有什么区别? (PostgreSQL)
    # SELECT pg_relation_size(20306, 'main') AS main, pg_relation_size(20306, 'fsm') AS fsm, pg_relation_size(20306, 'vm') AS vm, pg_relation_size(20306, 'init') AS init, pg_table_size(20306), pg_indexes_size(20306)......
  • 店铺营业状态设置_功能测试&文档接口的分类
       ......
  • postgresql权限
    ostgresql权限详解角色前言PostgreSQL使用角色的概念管理数据库访问权限。根据角色的设置方式,可以将角色视为数据库用户或数据库用户组。角色可以拥有数据库对象(例如,表和函数),并可以将对这些对象的权限分配给其他角色,以控制谁有权访问哪些对象。此外,还可以将角色的成员资格授予......
  • 6.Filebeat的安装及收集日志到Elasticsearch并使用自定义索引
    利用Filebeat收集日志Filebeat是用于转发和集中日志数据的轻量级传送程序.作为服务器上的代理安装,Filebeat监视指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或Logstash进行索引.Logstash也可以直接收集日志,但需要安装JDK并且会占用至少500M以上的内存生产......
  • MATLAB用深度学习长短期记忆 (LSTM) 神经网络对智能手机传感器时间序列数据进行分类|
    原文链接:http://tecdat.cn/?p=26318原文出处:拓端数据部落公众号 最近我们被客户要求撰写关于长短期记忆(LSTM)神经网络的研究报告,包括一些图形和统计输出。此示例说明如何使用长短期记忆(LSTM)网络对序列数据的每个时间步长进行分类。要训​​练深度神经网络对序列数据......
  • 【星球知识卡片】视频分类与行为识别有哪些核心技术,对其进行长期深入学习...
    大家好,欢迎来到我们的星球知识小卡片专栏,本期给大家分享视频分类的核心技术点。作者&编辑|言有三13D卷积视频相对于图像多出了一个维度,而3D卷积正好可以用于处理这个维度,因此也非常适合视频分类任务,不过缺点是计算量比较大,下图展示了一个简单的3D模型。2RNN与LSTM视频和语音......
  • mysql与pg的主键索引说明
    mysql与pg的主键说明mysql插入顺序与插入随机测试案例B+Tree原理id顺序的方式插入id随机的方式插入Postgresql堆组织表CTIDPg的元组及索引原理Pg与mysql与oracel问题mysql插入顺序与插入随机测试案例  创建了两张表一张表是按顺序来插入的一张表......
  • 爬虫与搜索引擎优化:通过Python爬虫提升搜索排名
    作为一名专业的爬虫程序员,我深知网站的搜索排名对于业务的重要性。在如今竞争激烈的网络世界中,如何让自己的网站在搜索引擎结果中脱颖而出,成为关键。今天,和大家分享一些关于如何通过Python爬虫来提升网站的搜索排名的技巧和实践经验。无论你是在提升自己的网站排名还是优化客户的SE......