模块课程(1/4)
索引和 B 树
数据库如何在几分之一秒内从数百万行中找到一条记录?
默认情况下,当我们请求 SELECT * FROM customers WHERE city = 'Milano' 时,Postgres 必须执行 顺序扫描:它从磁盘中逐行物理读取整个表,将每个城市与“米兰”进行比较。当表包含数百万条记录时,此过程会降低性能。
这些瓶颈的主要结构答案是索引。
索引(B 树)
索引的工作原理与一本大书后面的分析索引完全相同。我们不是阅读整本书来查找其中提到“Milano”的地方,而是查找后面几页,其中“Milano”一词将我们重定向到[p. 45, 114, 230]。
数据库在幕后构建这种独立的、非常紧凑的数据结构(通常是“B 树”),该数据结构按相关列排序,包含指向匹配行的物理存储的直接指针。
-- Creare un indice semplice
CREATE INDEX idx_customers_city ON customers(city);此单个操作会触发 Postgres 引擎,该引擎将在后台提取所有 city 值并为其建立索引。完成后,后续的每个 SELECT ... WHERE city = '...' 都会飞行!
主键和唯一性
您是否知道主键 (PRIMARY KEY) 和 UNIQUE 键规则在幕后秘密使用索引?由于数据库必须确保在插入或更改行时电子邮件或 ID 永远不会重复,因此 PostgreSQL 会自动在它们之上创建隐式 B 树索引:这样唯一性检查只需几微秒。
这就是为什么 ID 字段上的连接具有令人难以置信的性能。
删除索引
如果您意识到繁重的查询已发生变化并且从未查阅过索引,那么明智的做法是销毁它并回收重要空间:
DROP INDEX idx_customers_city;轮到你了
在我们的电子商务中,我们通过仪表板注意到,我们经常按国籍(客户中的国家/地区列)过滤客户。 \n在国家列上创建一个新的基本索引并将其命名为“idx_customers_country”。
显示提示
使用 CREATE INDEX index_name ON table_name(column_name);
3 次尝试后可用的解决方案
探索二级唯一索引
B 树索引还可用于在创建时模拟 UNIQUE 约束并加快查找速度,同时使逻辑意图明确并强制执行。\n\n在声明 UNIQUE 关键字的位置创建一个新索引。对其进行定义,以便阻止其他用户进行任何不需要的重复注册,强制“客户”的“电子邮件”列具有唯一性,并将其命名为“idx_unique_email_customer”。
显示提示
写入 CREATE UNIQUE INDEX index_name ON 表(列);
3 次尝试后可用的解决方案