YOLO X Layout开源大模型应用:免费替代商业版面分析工具的低成本部署方案
2026/4/16 20:54:26
索引是数据库中的一种快速查询数据的方法。索引中记录了表中的一列或多列值与其物理位置之间的对应关系,就好比是一本书前面的目录,通过目录中页码就能快速定位到我们需要查询的内容。
除了加快查询以外,比如唯一索引还可以起到唯一约束的作用。
CREATETABLEcontacts(idintPRIMARYKEY,namevarchar(40),phonevarchar(32)[],addresstext);为了实现按姓名name快速查询,可以在字段name上建一个 BTree 索引:
CREATEINDEXidx_contacts_nameONcontacts(name);如果想按电话号码phone字段做快速查询(例如查询某个电话号码是谁的),由于此字段是一个数组,BTree 索引不再适用,可以建一个 GIN 索引:
CREATEINDEXidx_contacts_phoneONcontactsUSINGgin(phone);查询示例:
SELECT*FROMcontactsWHEREphone @>ARRAY['13422334455'::varchar(32)];解释:
@>是数组操作符,表示“包含”的意思,GIN 索引能在@>上起作用。
CREATEINDEXidx_contacts_nameONcontacts(name)WITH(FILLFACTOR=50);CREATEINDEXidx_contacts_nameONcontacts(nameDESC);-- 空值排在非空值前面CREATEINDEXidx_contacts_nameONcontacts(nameDESCNULLSFIRST);-- 空值排在非空值后面CREATEINDEXidx_contacts_nameONcontacts(nameDESCNULLSLAST);默认情况下,创建索引时会锁定表以防止写入,然后对表做全表扫描。在此过程中:
CREATETABLEtesttab01(idintPRIMARYKEY,noteint);INSERTINTOtesttab01SELECTgenerate_series(1,5000000),generate_series(1,5000000);在一个窗口中创建索引:
CREATEINDEXidx_testtab01_noteONtesttab01(note);在另一个窗口中执行删除操作将被阻塞:
DELETEFROMtesttab01WHEREid=1;CONCURRENTLY选项创建索引这种方式不会长时间阻塞 DML 操作,但耗时更长,因为需要两次扫描表。
DROPINDEXIFEXISTSidx_testtab01_note;CREATEINDEXCONCURRENTLY idx_testtab01_noteONtesttab01(note);另一个窗口的删除语句可以正常执行:
DELETEFROMtesttab01WHEREid=2;DELETEFROMtesttab01WHEREid=3;如果在并发创建索引过程中取消操作,可能会导致索引残留(状态为INVALID)。
-- 查看表结构,确认无效索引\d testtab01-- 手动删除无效索引DROPINDEXidx_testtab01_note;ALTERINDEXidx_contacts_nameRENAMETOidx_contacts_name_old;ALTERINDEXidx_contacts_name_oldSETTABLESPACEtbs_data01;ALTERINDEXidx_contacts_name_oldSET(fillfactor=75);\d+idx_contacts_name_oldDROPINDEXIFEXISTSidx_contacts_name_old;RESTRICT行为如果有对象依赖该索引,删除会失败。
CREATETABLEclass(class_noint,class_namevarchar(40));CREATEUNIQUEINDEXindex_unique_class_noONclass(class_no);CREATETABLEstudent(student_nointPRIMARYKEY,student_namevarchar(40),ageint,class_nointREFERENCESclass(class_no));-- 删除索引会失败,因为有外键依赖DROPINDEXindex_unique_class_no;CASCADE强制删除DROPINDEXindex_unique_class_noCASCADE;注意:使用
CASCADE会同时删除依赖该索引的外键约束。