postgresql(PostgreSQL全文检索简介)

2026-06-04 01:10:01 :0

postgresql(PostgreSQL全文检索简介)

大家好,postgresql相信很多的网友都不是很明白,包括PostgreSQL全文检索简介也是一样,不过没有关系,接下来就来为大家分享关于postgresql和PostgreSQL全文检索简介的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

本文目录

PostgreSQL全文检索简介

PostgreSQL自带有一个简易的全文检索引擎,可以实现小规模数据量的全文检索功能。本文我们将引导介绍一下这个功能,对于小数据量的搜索这个功能是足够使用的,而无需搭建额外的ES等重量级的全文检索服务器。

PG的全文检索操作符是 @@ ,当一个 tsvector (文档)和 tsquery (条件)匹配时返回 true ,并且前后顺序无影响:

和普通的SQL查询一样,只要在 WHERE 条件中使用这个符号就代表使用全文检索条件筛选文档了。如:

@@ 操作符支持隐式转换,对于 text 类型可以无需强类型转换( ::tsvector 或 to_tsvector(config_name, text) ),所以这个操作符实际支持的参数类型是这样的:

tsquery 查询条件并不是简单的正则,而是一组搜索术语,使用并且使用布尔操作符 & (AND)、 | (OR)和 ! (NOT)来组合它们,还有短语搜索操作符 《-》 (FOLLOWED BY)。更详细的语法参见 此文档 。

此外,PostgreSQL还提供了两个相对简化的版本 plainto_tsquery 和 phraseto_tsquery 。

plainto_tsquery ( plainto_tsquery( querytext text) returns tsquery )用户将未格式化的 text 经过分词之后,插入 & 符号转为 tsquery :

phraseto_tsquery ( phraseto_tsquery( querytext text) returns tsquery )行为和 plainto_tsquery 行为类似,但是分词之后不是插入 & 而是 《-》 (FOLLOWED BY):

使用索引可以加快全文检索的速度。对于全文检索来说,可选的索引类型是 GIN (通用倒排索引)和 GIST (通用搜索树),官方文档更推荐使用 GIN索引 。创建一个 GIN 索引的范例:

也可以是一个连接列:

还可以单独创建一个 tsvector 列,为这个列创建索引:

除了普通的 ORDER BY 条件之外,PostgreSQL为全文检索提供了两个可选的排序函数 ts_rank() returns float4 ,以便实现基于 权重 的排序。

此外,对于PostgreSQL 9.6以上的版本还可以使用 RUM index 排序。(注意,这个是扩展,默认不包含)。

PostgreSQL默认的分词字典中并不包含中文分词字典,因此我们必须手工引入。目前一个比较好的项目是 zhparser ,同时这个插件也是阿里云的RDS默认包含的。安装和启用没什么好说的。值得一提的是分词配置参数。

在 CREATE EXTENSION 之后,必须配置分词参数才能正确进行分词和查找,否则什么都查不到。官方文档提供的一个配置策略是:

n,v,a,i,e,l 这几个字母分别表示一种token策略,只启用了这几种token mapping,其余则被屏蔽。具体支持的参数和含义可以用 \dFp+ zhparser 显示:

WITH simple 表示词典使用的是内置的simple词典,即仅做小写转换。根据需要可以灵活定义词典和token映射,以实现屏蔽词和同义词归并等功能。

比如我们看下面这个例子:

可以看到 江淮 这个词组在查询的时候被忽略了,我们启用 j (abbreviation,简称)再看看结果:

所以实际使用中要设置合理的token types,过少将导致搜索结果不准确,过多将导致性能下降。此外,还有一些诸如 短词复合: zhparser.multi_short = f 这一类的控制分词结果的选项,根据实际使用酌情开启。

为什么选择PostgreSQL而不是MySQL

David Bolton是一名独立开发者,他使用PostgreSQL和MySQL都已有超过十年的时间。近日,他撰文阐述了选择PostgreSQL而不是MySQL的理由。他认为,MySQL之所以仍然如此流行是因为每个Linux Web托管软件包中都包含它。但随着Oracle将其收购,MySQL的开源程度大不如前。而PostgreSQL不仅发展更快,还加入了JSON支持,成为少数几个支持NoSQL的关系型数据库之一。
MySQL/MariaDB的当前版本是5.7.6(MariaDB为MySQL创建者Monty Widenius创建的一个MySQL分支),PostgreSQL的版本是9.4.1。Bolton从以下几个方面对比了两者的最新版本:
ANSI标准兼容性:与先前的版本相比,MySQL已经有了长足的进步,但MySQL背后的哲学是,如果客户喜欢,他们就会支持非标准扩展,而PostgreSQL从开始就将标准构建到平台里。不过,二者殊途同归,差别不大;
ACID遵从性:PostgreSQL有一个存储引擎,而MySQL有9个,但只有MyIsam和InnoDB与大部分用户有关,其中,后者为默认存储引擎。InnoDB和PostgreSQL都完全遵循ACID,差别不大;
无锁表修改:MyIsam使用表级锁来提升速度,这会导致写互斥。但PostgreSQL和InnoDB均使用行级锁,差别不大;
子查询:长期以来,这一直是MySQL的一个弱点,虽然5.6.5作了重大改进,但PostgreSQL对表连接支持得更好,尤其是MySQL不支持全外连接,因此,这方面PostgreSQL胜过MySQL;
JSON支持和NoSQL:PostgreSQL最近增加了JSON支持,与传统的关系型数据库相比,它提供了更大的数据存储灵活性,因此,这方面PostgreSQL胜过MySQL。
此外,Bolton指出,选择PostgreSQL还有如下理由:
更好的许可:PostgreSQL采用类似MIT的许可协议,允许开发人员做任何事情,包括在开源或闭源产品中商用,而MySQL的客户端遵循GPL许可协议,所以开发人员必须向Oracle付费或者将自己的应用程序开源;
更好的数据一致性: PostgreSQL会在数据插入和更新之前进行严格的验证,确保数据合法才会进行相应的操作,但在MySQL中,开发人员需要将服务器设定为严格SQL模式才能达到同样的目的,否则可能会产生不规范数据;
服务器扩展:MySQL提供了插件程序API,
支持C/C++或任何兼容C的语言,而且从5.7.3版本开始支持全文搜索,PostgreSQL有一个类似的系统但支持的语言更多,包括C/C++、
Java、.Net、Perl、
Python、Ruby、Tcl、ODBC等,它甚至可以在单独的进程中运行用户提供的代码;除了所有关系型数据库都包含的有关数据库、表和列的一般信息
外,PostgreSQL系统目录中还可以包含关于数据类型、函数和存取方法的信息,开发人员可以通过修改这些信息实现扩展。

postgresql----数组类型和函数

***隐藏网址***

postgresql支持数组类型,可以是基本类型,也可以是用户自定义的类型。日常中使用数组类型的机会不多,但还是可以了解一下。不像C或JAVA高级语言的数组下标从0开始,postgresql数组下标从1开始,既可以指定长度,也可以不指定长度。且postgresql既支持一维数组,也支持多维数组,但是平时二维数组也就够用了。

示例1.使用ARRAY构建数组类型
---1*4的一维数组test=#selectarray;

  array  -----------{1,2,3,4}

(1 row)--2*2的二维数组test=#selectarray;

    array    ---------------{{1,2},{3,4}}

(1 row)--1*2的二维数组,基本类型为box矩形类型,且和上面相比box类型元素之间是以分号分隔的,其他所有类型的数据都是以逗号分隔的test=#selectarray;

            array            -----------------------------{(1,1),(0,0);(0,0),(-1,-1)}

(1row)
示例2.创建一张表,字段包含数组类型

其中int表示数组长度为4.
test=#createtabletbl_array(aint,2);INSERT01test=#select*from tbl_array ;

    a    |b| c ---------+-------------------+---{1,2}|{{1,2,3},{4,5,6}}|1 {1,2,3}|{{1,2},{4,5}}|2(2 rows)

test=#selectafromtbl_arraywherec=1;

a | b ---+---1|

(1 row)

test=#selectafromtbl_arraywherec=1;

a | b ---+---1|4(1 row)

test=#selectafromtbl_arraywherec=1;

a | b ---+---1|

(1row)
test=#updatetbl_arraysetafrom tbl_array ;

  a  | b -----+---100|200|

(2rows)
也可以使用方式来查询数组连续的某些元素。
test=#selectafrom tbl_array ;

  a  -------{2}

{2,3}

(2 rows)

test=#selectafrom tbl_array ;

    a    -----------{100,2}

{200,2,3}

(2rows)
数组操作符与函数

操作符

操作符描述示例结果

=相等 SELECT ARRAY; t

《》不等于 select ARRAY; t

《小于 select ARRAY; t

》大于 select ARRAY; t

《=小于或等于 select ARRAY; t

》=大于或等于 select ARRAY; t

@》包含 select ARRAY; t

《@包含于 select ARRAY; t

&&重叠(是否有相同元素) select ARRAY; t

||数组与数组连接 select ARRAY; {1,2,3,4,5,6}

||数组与数组连接 select ARRAY; {{1,2,3},{4,5,6},{7,8,9}}

||元素与数组连接 select 3 || ARRAY; {3,4,5,6}

||数组与元素连接 select ARRAY || 7; {4,5,6,7}
函数

函数返回类型描述示例结果

array_append(anyarray,anyelement)anyarray 在数组末尾追加元素 

SELECT array_append(ARRAY, 3);

 {1,2,3}

array_cat(anyarray,anyarray)anyarray 连接两个数组 SELECT array_cat(ARRAY); {1,2,3,4,5}

array_ndims(anyarray)int 返回数组维数 SELECT array_ndims(ARRAY); 2

array_dims(anyarray)text 返回数组维数的文本表示 SELECT array_dims(ARRAY

array_fill(anyelement,int={7,7,7}

array_length(anyarray,int)int 返回数组指定维度的长度 SELECT array_length(array, 1); 3

array_lower(anyarray,int)int 返回数组指定维度的下界 SELECT array_lower(’, 1); 0

array_position(anyarray,anyelement, ’mon’); 2

array_positions(anyarray,anyelement)int, ’A’); {1,2,4}

array_prepend(anyelement,anyarray)anyarray 在数组开头添加新的元素 SELECT array_prepend(1, ARRAY); {1,2,3}

array_remove(anyarray,anyelement)anyarray 从数组中删除所有的指定元素,必须是一维数组 SELECT array_remove(ARRAY, 2); {1,3}

array_replace(anyarray,anyelement,anyelement)anyarray 替换指定数组元素为新的元素 SELECT array_replace(ARRAY, 5, 3); {1,2,3,4}

array_to_string(anyarray,text, ’,’, ’*’); 1,2,3,*,5

array_upper(anyarray,int)int 数组指定维度的上届 SELECT array_upper(ARRAY, 1); 4

cardinality(anyarray)int 返回数组所有维度的长度总和,如果是空数组则返回0 SELECT cardinality(ARRAY); 4

string_to_array(text,text 将文本使用分隔符分隔后转换为数组,如果指定第三个参数,则第三个参数在数组中被转换为NULL SELECT string_to_array(’xx~^~yy~^~zz’, ’~^~’, ’yy’); {xx,NULL,zz}

unnest(anyarray)setof anyelement 将数组元素转换为行 SELECT unnest(ARRAY); 

1

2

unnest(anyarray,anyarray); 

unnest | unnest

--------+----

1 | foo

2 | bar

  | baz

postgresql和mysql的区别

特性 MySQL PostgreSQL
实例 通过执行 MySQL 命令(mysqld)启动实例。一个实例可以管理一个或多个数据库。一台服务器可以运行多个 mysqld 实例。一个实例管理器可以监视 mysqld 的各个实例。
通过执行 Postmaster 进程(pg_ctl)启动实例。一个实例可以管理一个或多个数据库,这些数据库组成一个集群。集群是磁盘上的一个区域,这个区域在安装时初始化并由一个目录组成,所有数据都存储在这个目录中。使用 initdb 创建第一个数据库。一台机器上可以启动多个实例。
数据库 数据库是命名的对象集合,是与实例中的其他数据库分离的实体。一个 MySQL 实例中的所有数据库共享同一个系统编目。 数据库是命名的对象集合,每个数据库是与其他数据库分离的实体。每个数据库有自己的系统编目,但是所有数据库共享 pg_databases。
数据缓冲区 通过 innodb_buffer_pool_size 配置参数设置数据缓冲区。这个参数是内存缓冲区的字节数,InnoDB 使用这个缓冲区来缓存表的数据和索引。在专用的数据库服务器上,这个参数最高可以设置为机器物理内存量的 80%。 Shared_buffers 缓存。在默认情况下分配 64 个缓冲区。默认的块大小是 8K。可以通过设置 postgresql.conf 文件中的 shared_buffers 参数来更新缓冲区缓存。
数据库连接 客户机使用 CONNECT 或 USE 语句连接数据库,这时要指定数据库名,还可以指定用户 id 和密码。使用角色管理数据库中的用户和用户组。 客户机使用 connect 语句连接数据库,这时要指定数据库名,还可以指定用户 id 和密码。使用角色管理数据库中的用户和用户组。
身份验证 MySQL 在数据库级管理身份验证。 基本只支持密码认证。 PostgreSQL 支持丰富的认证方法:信任认证、口令认证、Kerberos 认证、基于 Ident 的认证、LDAP 认证、PAM 认证
加密 可以在表级指定密码来对数据进行加密。还可以使用 AES_ENCRYPT 和 AES_DECRYPT 函数对列数据进行加密和解密。可以通过 SSL 连接实现网络加密。 可以使用 pgcrypto 库中的函数对列进行加密/解密。可以通过 SSL 连接实现网络加密。
审计 可以对 querylog 执行 grep。 可以在表上使用 PL/pgSQL 触发器来进行审计。
查询解释 使用 EXPLAIN 命令查看查询的解释计划。 使用 EXPLAIN 命令查看查询的解释计划。
备份、恢复和日志 InnoDB 使用写前(write-ahead)日志记录。支持在线和离线完全备份以及崩溃和事务恢复。需要第三方软件才能支持热备份。 在数据目录的一个子目录中维护写前日志。支持在线和离线完全备份以及崩溃、时间点和事务恢复。 可以支持热备份。
JDBC 驱动程序 可以从 参考资料 下载 JDBC 驱动程序。 可以从 参考资料 下载 JDBC 驱动程序。
表类型 取决于存储引擎。例如,NDB 存储引擎支持分区表,内存引擎支持内存表。 支持临时表、常规表以及范围和列表类型的分区表。不支持哈希分区表。 由于PostgreSQL的表分区是通过表继承和规则系统完成了,所以可以实现更复杂的分区方式。
索引类型 取决于存储引擎。MyISAM:BTREE,InnoDB:BTREE。 支持 B-树、哈希、R-树和 Gist 索引。
约束 支持主键、外键、惟一和非空约束。对检查约束进行解析,但是不强制实施。 支持主键、外键、惟一、非空和检查约束。
存储过程和用户定义函数 支持 CREATE PROCEDURE 和 CREATE FUNCTION 语句。存储过程可以用 SQL 和 C++ 编写。用户定义函数可以用 SQL、C 和 C++ 编写。 没有单独的存储过程,都是通过函数实现的。用户定义函数可以用 PL/pgSQL(专用的过程语言)、PL/Tcl、PL/Perl、PL/Python 、SQL 和 C 编写。
触发器 支持行前触发器、行后触发器和语句触发器,触发器语句用过程语言复合语句编写。 支持行前触发器、行后触发器和语句触发器,触发器过程用 C 编写。
系统配置文件 my.conf Postgresql.conf
数据库配置 my.conf Postgresql.conf
客户机连接文件 my.conf pg_hba.conf
XML 支持 有限的 XML 支持。 有限的 XML 支持。
数据访问和管理服务器 OPTIMIZE TABLE —— 回收未使用的空间并消除数据文件的碎片
myisamchk -analyze —— 更新查询优化器所使用的统计数据(MyISAM 存储引擎)
mysql —— 命令行工具
MySQL Administrator —— 客户机 GUI 工具 Vacuum —— 回收未使用的空间
Analyze —— 更新查询优化器所使用的统计数据
psql —— 命令行工具
pgAdmin —— 客户机 GUI 工具
并发控制 支持表级和行级锁。InnoDB 存储引擎支持 READ_COMMITTED、READ_UNCOMMITTED、REPEATABLE_READ 和 SERIALIZABLE。使用 SET TRANSACTION ISOLATION LEVEL 语句在事务级设置隔离级别。 支持表级和行级锁。支持的 ANSI 隔离级别是 Read Committed(默认 —— 能看到查询启动时数据库的快照)和 Serialization(与 Repeatable Read 相似 —— 只能看到在事务启动之前提交的结果)。使用 SET TRANSACTION 语句在事务级设置隔离级别。使用 SET SESSION 在会话级进行设置。
MySQL相对于PostgreSQL的劣势:
MySQL
PostgreSQL

最重要的引擎InnoDB很早就由Oracle公司控制。目前整个MySQL数据库都由Oracle控制。
BSD协议,没有被大公司垄断。

对复杂查询的处理较弱,查询优化器不够成熟
很强大的查询优化器,支持很复杂的查询处理。

只有一种表连接类型:嵌套循环连接(nested-loop),不支持排序-合并连接(sort-merge join)与散列连接(hash join)。
都支持

postgresql是什么

PostgreSQL
PostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES,版本 4.2为基础的对象关系型数据库管理系统(ORDBMS)。 POSTGRES 领先的许多概念只是在非常迟的时候才出现在商业数据库中。
PostgreSQL 是最初的伯克利的代码的一个开放源码的继承人。
它支持大部分 SQL:2003 标准并且提供了许多其他现代特性:复杂查询、外键、触发器、视图、事务完整性、多版本并发控制
同样,PostgreSQL 可以用许多方法扩展,比如, 通过增加新的:数据类型、函数、操作符、聚集函数、索引方法、过程语言
并且,因为许可证的灵活,任何人都可以以任何目的免费使用,修改,和分发 PostgreSQL, 不管是私用,商用,还是学术研究使用。

postgresql是什么数据库请详解一下,谢谢

分类: 电脑/网络 》》 程序设计 》》 其他编程语言
解析:

PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS), 也是目前功能最强大,特性最丰富和最复杂的自由软件数据库系统。有些特性甚至连商业数据库都不具备。这个起源于伯克利(BSD)的数据库研究计划目前已经衍生成一项国际开发项目, 并且有非常广泛的用户。

PostgreSQL 可以说是最富特色的自由数据库管理系统,甚至我们也可以说是最强大的自由软件数据库管理系统。事实上, PostgreSQL 的特性覆盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,首先,它包括了可以说是目前世界上最丰富的数据类型的支持,其中有些数据类型可以说连商业数据库都不具备, 比如 IP 类型和几何类型等;其次,PostgreSQL 是全功能的自由软件数据库,很长时间以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统。直到最近才有 Inprise 的 InterBase 以及 SAP 等厂商将其原先专有软件开放为自由软件之后才打破了这个唯一。

postgresql 建立索引

一、索引的类型:

PostgreSQL提供了多  种索引类型:B-Tree、Hash、GiST和GIN,由于它们使用了不同的算法,因此每种索引类型都有其适合的查询类型,缺省时,CREATE INDEX命令将创建B-Tree索引。
1. B-Tree:

CREATE TABLE test1 (

id integer,

content varchar

);

CREATE INDEX test1_id_index ON test1 (id);

B-Tree索引主要用于等于和范围查询,特别是当索引列包含操作符" 《、=和》"作为查询条件时,PostgreSQL的查询规划器都会考虑使用B-Tree索引。在使用BETWEEN、IN、IS NULL和IS NOT NULL的查询中,PostgreSQL也可以使用B-Tree索引。然而对于基于模式匹配操作符的查询,如LIKE、ILIKE、~和 ~*,仅当模式存在一个常量,且该常量位于模式字符串的开头时,如col LIKE ’foo%’或col ~ ’^foo’,索引才会生效,否则将会执行全表扫描,如:col LIKE ’%bar’。
2. Hash:

CREATE INDEX name ON table USING hash (column);

散列(Hash)索引只能处理简单的等于比较。当索引列使用等于操作符进行比较时,查询规划器会考虑使用散列索引。

这里需要额外说明的是,PostgreSQL散列索引的性能不比B-Tree索引强,但是散列索引的尺寸和构造时间则更差。另外,由于散列索引操作目前没有记录WAL日志,因此一旦发生了数据库崩溃,我们将不得不用REINDEX重建散列索引。
3. GiST:

GiST索引不是一种单独的索引类型,而是一种架构,可以在该架构上实现很多不同的索引策略。从而可以使GiST索引根据不同的索引策略,而使用特定的操作符类型。
4. GIN:

GIN索引是反转索引,它可以处理包含多个键的值(比如数组)。与GiST类似,GIN同样支持用户定义的索引策略,从而可以使GIN索引根据不同的索引策略,而使用特定的操作符类型。作为示例,PostgreSQL的标准发布中包含了用于一维数组的GIN操作符类型,如:、=、&&等。

二、复合索引:

PostgreSQL中的索引可以定义在数据表的多个字段上,如:

CREATE TABLE test2 (

major int,

minor int,

name varchar

}

CREATE INDEX test2_mm_idx ON test2 (major, minor);

1. B-Tree类型的复合索引:

在B-Tree类型的复合索引中,该索引字段的任意子集均可用于查询条件,不过,只有当复合索引中的第一个索引字段(最左边)被包含其中时,才可以获得最高效率。
2. GiST类型的复合索引:

在GiST类型的复合索引中,只有当第一个索引字段被包含在查询条件中时,才能决定该查询会扫描多少索引数据,而其他索引字段上的条件只是会限制索引返回的条目。假如第一个索引字段上的大多数数据都有相同的键值,那么此时应用GiST索引就会比较低效。

3. GIN类型的复合索引:

与B-Tree和GiST索引不同的是,GIN复合索引不会受到查询条件中使用了哪些索引字段子集的影响,无论是哪种组合,都会得到相同的效率。

使用复合索引应该谨慎。在大多数情况下,单一字段上的索引就已经足够了,并且还节约时间和空间。除非表的使用模式非常固定,否则超过三个字段的索引几乎没什么用处。

三、组合多个索引:

PostgreSQL可以在查询时组合多个索引(包括同一索引的多次使用),来处理单个索引扫描不能实现的场合。与此同时,系统还可以在多个索引扫描之间组成AND和OR的条件。比如,一个类似WHERE x = 42 OR x = 47 OR x = 53 OR x = 99的查询,可以被分解成四个独立的基于x字段索引的扫描,每个扫描使用一个查询子句,之后再将这些扫描结果OR在一起并生成最终的结果。另外一个例子是,如果我们在x和y上分别存在独立的索引,那么一个类似WHERE x = 5 AND y = 6的查询,就会分别基于这两个字段的索引进行扫描,之后再将各自扫描的结果进行AND操作并生成最终的结果行。

为了组合多个索引,系统扫描每个需要的索引,然后在内存里组织一个BITMAP,它将给出索引扫描出的数据在数据表中的物理位置。然后,再根据查询的需要,把这些位图进行AND或者OR的操作并得出最终的BITMAP。最后,检索数据表并返回数据行。表的数据行是按照物理顺序进行访问的,因为这是位图的布局,这就意味着任何原来的索引的排序都将消失。如果查询中有ORDER BY子句,那么还将会有一个额外的排序步骤。因为这个原因,以及每个额外的索引扫描都会增加额外的时间,这样规划器有时候就会选择使用简单的索引扫描,即使有多个索引可用也会如此。
四、唯一索引:

CREATE UNIQUE INDEX name ON table (column );
五、表达式索引:

表达式索引主要用于在查询条件中存在基于某个字段的函数或表达式的结果与其他值进行比较的情况,如:

SELECT * FROM test1 WHERE lower(col1) = ’value’;

此时,如果我们仅仅是在col1字段上建立索引,那么该查询在执行时一定不会使用该索引,而是直接进行全表扫描。如果该表的数据量较大,那么执行该查询也将会需要很长时间。解决该问题的办法非常简单,在test1表上建立基于col1字段的表达式索引,如:

CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));

SELECT * FROM people WHERE (first_name || ’ ’ || last_name) = ’John Smith’;

和上面的例子一样,尽管我们可能会为first_name和last_name分别创建独立索引,或者是基于这两个字段的复合索引,在执行该查询语句时,这些索引均不会被使用,该查询能够使用的索引只有我们下面创建的表达式索引。

CREATE INDEX people_names ON people ((first_name || ’ ’ || last_name));

CREATE INDEX命令的语法通常要求在索引表达式周围书写圆括弧,就像我们在第二个例子里显示的那样。如果表达式只是一个函数调用,那么可以省略,就像我们在第一个例子里显示的那样。

从索引维护的角度来看,索引表达式要相对低效一些,因为在插入数据或者更新数据的时候,都必须为该行计算表达式的结果,并将该结果直接存储到索引里。然而在查询时,PostgreSQL就会把它们看做WHERE idxcol = ’constant’,因此搜索的速度等效于基于简单索引的查询。通常而言,我们只是应该在检索速度比插入和更新速度更重要的场景下使用表达式索引。
六、部分索引:

部分索引(partial index)是建立在一个表的子集上的索引,而该子集是由一个条件表达式定义的(叫做部分索引的谓词)。该索引只包含表中那些满足这个谓词的行。

由于不是在所有的情况下都需要更新索引,因此部分索引会提高数据插入和数据更新的效率。然而又因为部分索引比普通索引要小,因此可以更好的提高确实需要索引部分的查询效率。见以下三个示例:

1. 索引字段和谓词条件字段一致:

CREATE INDEX access_log_client_ip_ix ON access_log(client_ip)

WHERE NOT (client_ip 》 inet ’192.168.100.0’ AND client_ip 《 inet ’192.168.100.255’);

下面的查询将会用到该部分索引:

SELECT * FROM access_log WHERE url = ’/index.html’ AND client_ip = inet ’212.78.10.32’;

下面的查询将不会用该部分索引:

一个不能使用这个索引的查询可以是

SELECT * FROM access_log WHERE client_ip = inet ’192.168.100.23’;

2. 索引字段和谓词条件字段不一致:

PostgreSQL支持带任意谓词的部分索引,唯一的约束是谓词的字段也要来自于同样的数据表。注意,如果你希望你的查询语句能够用到部分索引,那么就要求该查询语句的条件部分必须和部分索引的谓词完全匹配。 准确说,只有在PostgreSQL能够识别出该查询的WHERE条件在数学上涵盖了该索引的谓词时,这个部分索引才能被用于该查询。

CREATE INDEX orders_unbilled_index ON orders(order_nr) WHERE billed is not true;

下面的查询一定会用到该部分索引:

SELECT * FROM orders WHERE billed is not true AND order_nr 《 10000;

那么对于如下查询呢?

SELECT * FROM orders WHERE billed is not true AND amount 》 5000.00;

这个查询将不像上面那个查询这么高效,毕竟查询的条件语句中没有用到索引字段,然而查询条件"billed is not true"却和部分索引的谓词完全匹配,因此PostgreSQL将扫描整个索引。这样只有在索引数据相对较少的情况下,该查询才能更有效一些。

下面的查询将不会用到部分索引。

SELECT * FROM orders WHERE order_nr = 3501;
3. 数据表子集的唯一性约束:

CREATE TABLE tests (

subject text,

target text,

success boolean,

...

);

CREATE UNIQUE INDEX tests_success_constraint ON tests(subject, target) WHERE success;

该部分索引将只会对success字段值为true的数据进行唯一性约束。在实际的应用中,如果成功的数据较少,而不成功的数据较多时,该实现方法将会非常高效。
七、检查索引的使用:

见以下四条建议:

1. 总是先运行ANALYZE。

该命令将会收集表中数值分布状况的统计。在估算一个查询返回的行数时需要这个信息,而规划器则需要这个行数以便给每个可能的查询规划赋予真实的开销值。如果缺乏任何真实的统计信息,那么就会使用一些缺省数值,这样肯定是不准确的。因此,如果还没有运行ANALYZE就检查一个索引的使用状况,那将会是一次失败的检查。

2. 使用真实的数据做实验。

用测试数据填充数据表,那么该表的索引将只会基于测试数据来评估该如何使用索引,而不是对所有的数据都如此使用。比如从100000行中选1000行,规划器可能会考虑使用索引,那么如果从100行中选1行就很难说也会使用索引了。因为100行的数据很可能是存储在一个磁盘页面中,然而没有任何查询规划能比通过顺序访问一个磁盘页面更加高效了。与此同时,在模拟测试数据时也要注意,如果这些数据是非常相似的数据、完全随机的数据,或按照排序顺序插入的数据,都会令统计信息偏离实际数据应该具有的特征。

3. 如果索引没有得到使用,那么在测试中强制它的使用也许会有些价值。有一些运行时参数可以关闭各种各样的查询规划。

4. 强制使用索引用法将会导致两种可能:一是系统选择是正确的,使用索引实际上并不合适,二是查询计划的开销计算并不能反映现实情况。这样你就应该对使用和不使用索引的查询进行计时,这个时候EXPLAIN ANALYZE命令就很有用了。

PostgreSQL最大的优势是什么

PostgreSQL最大的优势主要是两个方面:
1)PostgreSQL的开源开放性:因为我们是开源的,变拥有了动态的社区、增长非常快的社区,新功能总是不断出现。不仅可靠性很高,性能也很高。
2)PostgreSQL的可扩展性:在1986年的时候,它便已经被设计为可扩展的。可以向数据库添加语言 可以添加数据类型 可以添加索引方法、操作符 、类型转换、聚合;支持GIS、Json、全文搜索、范围类型、XML。
Postgres的独特之处在于它同时执行关系和非关系操作。现在我们从很多不同的地方获取数据,关系系统必须具有灵活性,必须能够处理复杂的数据,而Postgres是唯一真正能够做到这一点的数据库。

postgresql是什么 何谓postgresql

1、PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统。

2、POSTGRES的许多领先概念只是在比较迟的时候才出现在商业网站数据库中。PostgreSQL支持大部分的SQL标准并且提供了很多其他现代特性,如复杂查询、外键、触发器、视图、事务完整性、多版本并发控制等。同样,PostgreSQL也可以用许多方法扩展,例如通过增加新的数据类型、函数、操作符、聚集函数、索引方法、过程语言等。另外,因为许可证的灵活,任何人都可以以任何目的免费使用、修改和分发PostgreSQL。

使用postgresql 和 mysql 哪个多

您好,是这样的:
1、MySQL相对来说比较年轻,首度出现在1994年。它声称自己是最流行的开源数据库。MySQL就是LAMP(用于Web开发的软件包,包括 Linux、Apache及Perl/PHP/Python)中的M。构建在LAMP栈之上的大多数应用都会使用MySQL,包括那些知名的应用,如 WordPress、Drupal、Zend及phpBB等。
一开始,MySQL的设计目标是成为一个快速的Web服务器后端,使用快速的索引序列访问方法(ISAM),不支持ACID。经过早期快速的发展之 后,MySQL开始支持更多的存储引擎,并通过InnoDB引擎实现了ACID。MySQL还支持其他存储引擎,提供了临时表的功能(使用MEMORY存 储引擎),通过MyISAM引擎实现了高速读的数据库,此外还有其他的核心存储引擎与第三方引擎。
2、PostgreSQL标榜自己是世界上最先进的开源数据库。PostgreSQL的一些粉丝说它能与Oracle相媲美,而且没有那么昂贵的价格和傲慢的客服。它拥有很长的历史,最初是1985年在加利福尼亚大学伯克利分校开发的,作为Ingres数据库的后继。
PostgreSQL是完全由社区驱动的开源项目,由全世界超过1000名贡献者所维护。它提供了单个完整功能的版本,而不像MySQL那样提供了 多个不同的社区版、商业版与企业版。PostgreSQL基于自由的BSD/MIT许可,组织可以使用、复制、修改和重新分发代码,只需要提供一个版权声 明即可。
虽然有不同的历史、引擎与工具,不过并没有明确的参考能够表明这两个数据库哪一个能够适用于所有情况。很多组织喜欢使用PostgreSQL,因为 它的可靠性好,在保护数据方面很擅长,而且是个社区项目,不会陷入厂商的牢笼之中。MySQL更加灵活,提供了更多选项来针对不同的任务进行裁剪。很多时 候,对于一个组织来说,对某个软件使用的熟练程度要比特性上的原因更重要。

关于postgresql到此分享完毕,希望能帮助到您。

postgresql(PostgreSQL全文检索简介)

本文编辑:admin
: postgresql

更多文章:


中国游戏大厅(中华游戏大厅为什么卸载不了)

中国游戏大厅(中华游戏大厅为什么卸载不了)

今天给各位分享中华游戏大厅为什么卸载不了的知识,其中也会对中华游戏大厅为什么卸载不了进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录中华游戏大厅为什么卸载不了手机游戏大厅(客户端)介绍为什么中国游戏中心打开进入

2025年9月18日 06:30

卡巴斯基杀毒软件要钱吗(卡巴斯基个人杀毒软件是完全免费的吗)

卡巴斯基杀毒软件要钱吗(卡巴斯基个人杀毒软件是完全免费的吗)

各位老铁们好,相信很多人对卡巴斯基杀毒软件要钱吗都不是特别的了解,因此呢,今天就来为大家分享下关于卡巴斯基杀毒软件要钱吗以及卡巴斯基个人杀毒软件是完全免费的吗的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录卡巴斯

2026年6月4日 22:10

chrome手机版官网(chrome手机版官网下载)

chrome手机版官网(chrome手机版官网下载)

chrome手机版官网下载Chrome手机版官网与下载相关内容介绍一、Chrome手机版官网概述Chrome手机版官网是Google公司为其移动设备用户提供的官方下载渠道。该网站不仅提供了最新版本的Chrome浏览器下载,还提供了丰富的使用

2025年4月23日 01:42

日本iptv网络电视(请问,你说的那个iHome的那个日本IPTV是一次性买了就可以吗以后每个月看还要不要交钱啊)

日本iptv网络电视(请问,你说的那个iHome的那个日本IPTV是一次性买了就可以吗以后每个月看还要不要交钱啊)

其实日本iptv网络电视的问题并不复杂,但是又很多的朋友都不太了解请问,你说的那个iHome的那个日本IPTV是一次性买了就可以吗以后每个月看还要不要交钱啊,因此呢,今天小编就来为大家分享日本iptv网络电视的一些知识,希望可以帮助到大家,

2025年10月16日 17:00

双人小游戏火柴人(可以组队一起玩的游戏)

双人小游戏火柴人(可以组队一起玩的游戏)

各位老铁们好,相信很多人对双人小游戏火柴人都不是特别的了解,因此呢,今天就来为大家分享下关于双人小游戏火柴人以及可以组队一起玩的游戏的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录可以组队一起玩的游戏火柴人大乱斗

2026年7月2日 14:30

恋爱类游戏手机游戏(可以谈恋爱的游戏手游)

恋爱类游戏手机游戏(可以谈恋爱的游戏手游)

本篇文章给大家谈谈恋爱类游戏手机游戏,以及可以谈恋爱的游戏手游对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录可以谈恋爱的游戏手游恋爱游戏手

2026年6月28日 10:30

帝国时代4怎么开局?帝国时代4-国家崛起 全中文版下载地址

帝国时代4怎么开局?帝国时代4-国家崛起 全中文版下载地址

各位老铁们,大家好,今天由我来为大家分享帝国时代4,以及帝国时代4怎么开局的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录帝国时代4怎么开局帝国时代

2025年10月25日 13:45

疯狂农场破解版无限金币(梦想城镇无限金币绿钞版怎么下载)

疯狂农场破解版无限金币(梦想城镇无限金币绿钞版怎么下载)

各位老铁们,大家好,今天由我来为大家分享疯狂农场破解版无限金币,以及梦想城镇无限金币绿钞版怎么下载的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录梦

2026年3月5日 17:45

南通长牌app下载南通长牌下载(南通长牌下载牌缘如何下载)

南通长牌app下载南通长牌下载(南通长牌下载牌缘如何下载)

大家好,关于南通长牌app下载南通长牌下载很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于南通长牌下载牌缘如何下载的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助

2025年12月7日 19:30

gba模拟器安卓版下载(都说苹果手机要安装gba模拟器才能玩口袋妖怪,怎么连模拟器都下载不了)

gba模拟器安卓版下载(都说苹果手机要安装gba模拟器才能玩口袋妖怪,怎么连模拟器都下载不了)

大家好,关于gba模拟器安卓版下载很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于都说苹果手机要安装gba模拟器才能玩口袋妖怪,怎么连模拟器都下载不了的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,

2025年9月8日 05:45

堡垒之夜手游下载,堡垒之夜手游下载安装

堡垒之夜手游下载,堡垒之夜手游下载安装

堡垒之夜手游下载安装堡垒之夜手游下载与安装全面指南一、引言随着移动游戏的飞速发展,众多热门游戏纷纷推出了手游版本,其中就包括广受欢迎的“堡垒之夜”。本文将详细介绍“堡垒之夜手游”的下载及安装过程,帮助玩家们快速上手这款热门游戏。二、下载前的

2025年5月24日 14:31

京东手机网页版(京东手机和网页购物车不一致)

京东手机网页版(京东手机和网页购物车不一致)

大家好,关于京东手机网页版很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于京东手机和网页购物车不一致的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本文目录京东

2026年7月17日 02:30

w软件下载免费(软件图标上有个粗笔画字母w的手写文字的软件在什么地方去下载呢)

w软件下载免费(软件图标上有个粗笔画字母w的手写文字的软件在什么地方去下载呢)

各位老铁们,大家好,今天由我来为大家分享w软件下载免费,以及软件图标上有个粗笔画字母w的手写文字的软件在什么地方去下载呢的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面

2025年7月25日 23:15

腾讯微信官网(怎样进入微信官网)

腾讯微信官网(怎样进入微信官网)

本篇文章给大家谈谈腾讯微信官网,以及怎样进入微信官网对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录怎样进入微信官网从哪里进入微信官网这么进

2025年10月24日 09:45

达人斗地主300真的可以提现吗?达人斗地主赚1000是真的吗

达人斗地主300真的可以提现吗?达人斗地主赚1000是真的吗

这篇文章给大家聊聊关于斗地主达人,以及达人斗地主300真的可以提现吗对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录达人斗地主300真的可以提现吗达人斗地主赚1000是真的吗达人斗地主提现300是真的吗达人斗地主提300有什么

2025年5月15日 03:30

seafile破解(docker部署seafile并使用远程数据库)

seafile破解(docker部署seafile并使用远程数据库)

“seafile破解”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看seafile破解(docker部署seafile并使用远程数据库)!本文目录docker部署seafile并使用远程数据库seafile软件如何禁止用户下

2026年10月5日 03:20

范伟八戒不喝酒怎敢对嫦娥下手什么电影?《长城》电影的影视特效制作的公司

范伟八戒不喝酒怎敢对嫦娥下手什么电影?《长城》电影的影视特效制作的公司

各位老铁们好,相信很多人对红点影视都不是特别的了解,因此呢,今天就来为大家分享下关于红点影视以及范伟八戒不喝酒怎敢对嫦娥下手什么电影的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录范伟八戒不喝酒怎敢对嫦娥下手什么

2026年6月9日 16:00

穿越火线手游下载官网(cf官网怎么下载)

穿越火线手游下载官网(cf官网怎么下载)

其实穿越火线手游下载官网的问题并不复杂,但是又很多的朋友都不太了解cf官网怎么下载,因此呢,今天小编就来为大家分享穿越火线手游下载官网的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录cf官网怎么下载cf手游在哪里

2025年10月11日 17:30

免费下载wifi万能钥匙,免费下载wifi万能钥匙官方正版

免费下载wifi万能钥匙,免费下载wifi万能钥匙官方正版

免费下载wifi万能钥匙官方正版免费下载wifi万能钥匙——无线网络的智能解锁之道在数字化时代,无线网络已经成为我们生活中不可或缺的一部分。无论是工作、学习还是娱乐,我们都需要依赖无线网络来保持连接。然而,有时我们可能会遇到网络连接问题,尤

2025年6月11日 18:11

小白一键重装系统教程,小白一键重装系统教程win10

小白一键重装系统教程,小白一键重装系统教程win10

小白一键重装系统教程win10小白一键重装系统教程及小白一键重装系统教程win10一、小白一键重装系统教程简介对于许多初次接触电脑的用户来说,系统出现问题时可能会感到无所适从。这时,一键重装系统工具就显得尤为重要。小白一键重装系统是一款简单

2025年4月21日 04:52

近期文章

本站热文

如何关闭端口(如何关闭端口)
2025-05-21 13:30:02 浏览:226
标签列表

热门搜索