集群索引
集群索引意味着告诉数据库在磁盘上存储实际上彼此接近的接近值。它们可以唯一标识 SQL 表中的行。每个表都可以只有一个聚集索引。一个聚集索引可以覆盖多个列。默认情况下,具有主键的列已经具有聚集索引。
dictionary
字典本身就是一个带有聚集索引的表。因为所有数据都是按字母顺序物理存储的。
非集群索引
非聚集索引就像一本书的简单索引。它们仅用于快速检索数据。不确定是否有唯一数据。非聚集索引包含非聚集索引键及其对应的数据位置指针。例如,一本书的内容索引包含一个主题或章节的关键字以及该主题或章节的页面位置。
book content index
一本书的内容表包含内容名称及其页面位置。不确定数据是否唯一。因为同一段落或文本行或单词可以多次放置。
PostgreSQL 索引
PostgreSQL 自动为表的PRIMARY KEY 和每个UNIQUE 约束创建索引。在 PostgreSQL 终端中登录数据库并输入 \d table_name。所有存储的索引都将被可视化。如果有聚集索引,那么它也会被识别出来。
创建表格
CREATE TABLE IF NOT EXISTS profile(
uid serial NOT NULL UNIQUE PRIMARY KEY,
username varchar(30) NOT NULL UNIQUE,
phone varchar(11) NOT NULL UNIQUE,
age smallint CHECK(age>12),
address text NULL
);
3 索引将自动创建。所有这些索引都是非聚集的
"profile_pkey" PRIMARY KEY, btree (uid)
"profile_phone_key" UNIQUE CONSTRAINT, btree (phone)
"profile_username_key" UNIQUE CONSTRAINT, btree (username)
使用 uid 和用户名创建我们自己的索引
CREATE INDEX profile_index ON profile(uid, username);
这实际上创建了一个非聚集索引。要使其集群化,请运行下一部分。
将非聚集索引转换为聚集索引
ALTER TABLE profile CLUSTER ON profile_index;
使用\d profile 检查表格。会是这样的:
Table "public.profile"
Column | Type | Collation | Nullable | Default
----------+-----------------------+-----------+----------+--------------------------------------
uid | integer | | not null | nextval('profile_uid_seq'::regclass)
username | character varying(30) | | not null |
phone | character varying(11) | | not null |
age | smallint | | |
address | text | | |
Indexes:
"profile_pkey" PRIMARY KEY, btree (uid)
"profile_phone_key" UNIQUE CONSTRAINT, btree (phone)
"profile_username_key" UNIQUE CONSTRAINT, btree (username)
"profile_index" btree (uid, username) CLUSTER
Check constraints:
"profile_age_check" CHECK (age > 12)
请注意,profile_index 现在是“CLUSTER”
现在,重新对表进行集群,以便表可以遵循集群索引角色
CLUSTER profile;