索引是把双刃剑,一方面,合理的索引可以大大提高数据库查询数据的效率;另一方面,索引也会增加数据库的管理负担。所以,如何使用索引是一件并不容易的事,我们需要根据实际场景决定使用什么样的索引。
简介
我们在数据库的使用中经常会遇到这种场景,查询一个有大量数据的表但返回结果只有一行数据或者几行数据,而不是要求返回全部结果。如果这个表没有索引,这条查询语句就会遍历整个表,然后查出需要的数据,这样效率太低。索引的建立相当于建立了一个目录,通过索引可以直接查询出需要的那几条数据,而不需要遍历全部数据。
使用
瀚高数据库提供多种索引的建立, B-tree、Hash、GiST、SP-GiST 、GIN 和 BRIN,每一种索引类型使用了一种不同的算法来适应不同类型的查询。这里我们重点说一下最常用的B-tree索引的建立。
一个索引可以定义在表的多个列上面,最多可以指定32个列(该限制可以在源代码文件pg_config_manual.h中修改,但是修改后需要重新编译PostgreSQL)。
例如:
create table test(
id integer,
name text,
sex char
)
create index testIndex on test(id,name);
当执行:select * from test where id=' ' and name = ' ' 时,此索引便会生效。而查询select * from test where id=' ' or name = ' '则不会生效。
PostgreSQL会自动为定义了一个唯一约束或主键的表创建一个唯一索引。
一个索引在每一个索引列上只能支持一种排序规则。如果需要多种排序规则,你可能需要多个索引。
例如:
CREATE TABLE test1c (
id integer,
content varchar COLLATE "x"
);
CREATE INDEX test1c_content_index ON test1c (content);
当执行SELECT * FROM test1c WHERE content > constant;时,上述索引将会加速查询。但对于有些查询条件,该索引则无效,比如下面这个查询:
SELECT * FROM test1c WHERE content > constant COLLATE "y";
可以新建一个对应的索引来提高查询效率:
CREATE INDEX test1c_content_y_index ON test1c (content COLLATE "y");
网友评论