PostgreSql 索引 INDEX

1.创建索引

create index index_name on table_name(field_name1, field_name2,······);

注:默认创建B-tree索引

2.查询索引

 select * from pg_indexes where tablename ='table_name';

3.删除索引

drop index index_name;

4.常见需要创建索引情况

a.主键自动建立唯一索引;

b.频繁作为查询条件的字段应该创建索引;

c.查询中与其他表有关联的字段,例如外键关系;

d.高并发的情况下一般选择复合索引;

e.查询中排序的字段创建索引将大大提高排序的速度(索引就是排序加快速查找);

f.查询中统计或者分组的字段;

g.存储空间固定的字段更适合选作索引的关键字,例:与 text 类型的字段相比, char 类型的字段较为适合选作索引关键字

5.常见无需创建索引情况

a. 频繁更新的字段不适合创建索引,因为每次更新不单单是更新记录,还会更新索引,保存索引文件;

b.表记录太少,不需要创建索引;

c.经常增删改的表,不需要创建索引;

d.表中包含大量重复数据,不需要创建索引,例如性别字段,只有男女,不适合建立索引; 

6.常见索引无效情况

a. 没有查询条件,或者查询条件没有建立索引;

b. 在查询条件上没有使用引导列;

c. 查询的数量是大表的大部分,应该是30%以上;

d. 使用内部函数导致索引失效,例:select * from test where round(id)=10;

e. 表记录较少

f. 隐式转换导致索引失效,例如:表的字段tu_mdn定义为varchar2(20), 但在查询时把该字段作为number类型以where条件传给数据库:

错误的例子:select * from test where tu_mdn=13333333333; 

正确的例子:select * from test where tu_mdn='13333333333'; 

g. 索引列进行运算导致索引失效,运算包括(+,-,*,/,! 等),例:

select * from test where round(id)=10; 

h. like "%_" 百分号在前;

i.单独引用复合索引里非第一位置的索引列;

j. B-tree索引 is null不会走,is not null会走,位图索引 is null,is not null 都会走  

猜你喜欢

转载自blog.csdn.net/nioqnw/article/details/84750297