索引是加速搜索引擎检索数据的一种特殊表查询。简单地说,索引是一个指向表中数据的指针。可以将索引类比为一本书的索引目录。索引有助于加快 SELECT 查询和 WHERE 子句,但它会减慢使用 UPDATE 和 INSERT 语句时的数据输入。索引可以创建或删除,但不会影响数据。
使用 CREATE INDEX 语句创建索引,它允许命名索引,指定表及要索引的一列或多列,并指示索引是升序排列还是降序排列。
索引也可以是唯一的,与 UNIQUE 约束类似,在列上或列组合上防止重复条目。
1.创建命令
CREATE INDEX index_name ON table_name;--使用CREATE INDEX来创建后面可以指定索引的名称,以及要索引的列
2.索引类型
2.1单列索引
--单列索引是一个只基于表的一个列上创建的索引,基本语法如下:CREATE INDEX index_nameON table_name (column_name);
2.2组合索引
--组合索引是基于表的多列上创建的索引,基本语法如下:CREATE INDEX index_nameON table_name (column1_name, column2_name);
不管是单列索引还是组合索引,该索引必须是在 WHERE 子句的过滤条件中使用非常频繁的列。
如果只有一列被使用到,就选择单列索引,如果有多列就使用组合索引。
2.3唯一索引
--使用唯一索引不仅是为了性能,同时也为了数据的完整性。--唯一索引不允许任何重复的值插入到表中。--基本语法如下:CREATE UNIQUE INDEX index_nameon table_name (column_name);
2.4局部索引
--局部索引是在表的子集上构建的索引;--子集由一个条件表达式上定义。索引只包含满足条件的行。--基础语法如下:CREATE INDEX index_nameon table_name (conditional_expression);
2.5隐式索引
隐式索引 是在创建对象时,由数据库服务器自动创建的索引。索引自动创建为主键约束和唯一约束。
3.示例
--在company表的salary列上创建一个索引runoobdb=# CREATE INDEX salary_index ON company(salary);CREATE INDEX
4.查看索引
--查看某个表中的所有索引--查看company表中的所有索引runoobdb=# \d company数据表 "public.company"栏位 | 类型 | 校对规则 | 可空的 | 预设---------+---------------+----------+----------+------id | integer | | not null |name | text | | not null |age | integer | | not null |address | character(50) | | |salary | real | | |索引:"company_pkey" PRIMARY KEY, btree (id) --这是个隐式索引,是创建表时自动创建的"salary_index" btree (salary)--查看数据库的所有索引runoobdb=# \di关联列表架构模式 | 名称 | 类型 | 拥有者 | 数据表----------+------------------+------+----------+-------------public | company1_pkey | 索引 | postgres | company1public | company3_age_key | 索引 | postgres | company3public | company3_pkey | 索引 | postgres | company3public | company4_pkey | 索引 | postgres | company4public | company5_pkey | 索引 | postgres | company5public | company6_pkey | 索引 | postgres | company6public | company7_pkey | 索引 | postgres | company7public | company_pkey | 索引 | postgres | companypublic | department1_pkey | 索引 | postgres | department1public | department_pkey | 索引 | postgres | departmentpublic | salary_index | 索引 | postgres | company(11 行记录)
5.删除索引
--一个索引可以使用DROP命令删除DROP INDEX index_name;--删除前面我们创建的索引runoobdb=# DROP INDEX salary_index;DROP INDEX--查看一下发现只剩下一个隐式索引了runoobdb=# \d company数据表 "public.company"栏位 | 类型 | 校对规则 | 可空的 | 预设---------+---------------+----------+----------+------id | integer | | not null |name | text | | not null |age | integer | | not null |address | character(50) | | |salary | real | | |索引:"company_pkey" PRIMARY KEY, btree (id)
6.什么时候避免使用索引
使用索引时,需要考虑下列准则:
- 索引不应该使用在较小的表上。
- 索引不应该使用在有频繁的大批量的更新或插入操作的表上。
- 索引不应该使用在含有大量的 NULL 值的列上。
- 索引不应该使用在频繁操作的列上。
