创建索引

postgre建索引方法:
单字段索引:
CREATE INDEX index_name ON table_name (field1);

联合索引:
CREATE INDEX index_name ON table_name (field1,field2);


如果创建单列索引中列值有很多重复,而联合查询的and列没有重复项,最好创建这两个字段的联合索引,提高查询速率

在postgre里,联合索引的使用,在select里的where条件是要求有序的,比如where field1=100和where field1=100 and field2=1000都可以利用到上面这个组合索引(多条件尽量不要用or,至少用UNION代替OR,用or也用不到联合索引),但使用where field2=1000就利用不到索引了。

例如

mytest=# \d tbl_real_net
Table "public.tbl_real_net"
Column | Type | Modifiers
---------+---------+--------------------
real_id | integer | not null default 0
net_id | integer | not null default 0
Indexes:
"tbl_real_net_pkey" PRIMARY KEY, btree (real_id, net_id)
"index_real_net" btree (real_id, net_id)


mytest=# explain SELECT * from tbl_real_net where net_id = 4 ;
QUERY PLAN
---------------------------------------------------------------------
Seq Scan on tbl_real_net (cost=0.00..174020.00 rows=50000 width=8)
Filter: (net_id = 4)
(2 rows)

没有用到索引

mytest=# explain SELECT * from tbl_real_net where  net_id = 4 and real_id = 3;
QUERY PLAN
----------------------------------------------------------------------------------
Bitmap Heap Scan on tbl_real_net (cost=5.42..955.61 rows=250 width=8)
Recheck Cond: ((real_id = 3) AND (net_id = 4))
-> Bitmap Index Scan on tbl_real_net_pkey (cost=0.00..5.36 rows=250 width=0)
Index Cond: ((real_id = 3) AND (net_id = 4))
(4 rows)

用到联合索引

mytest=# explain SELECT * from tbl_real_net where real_id = 3;
QUERY PLAN
--------------------------------------------------------------------------------------
Bitmap Heap Scan on tbl_real_net (cost=940.85..52372.32 rows=50000 width=8)
Recheck Cond: (real_id = 3)
-> Bitmap Index Scan on tbl_real_net_pkey (cost=0.00..928.35 rows=50000 width=0)
Index Cond: (real_id = 3)

用到单个real_id的索引

mytest=# explain SELECT * from tbl_real_net where  net_id = 4 or real_id = 3;
QUERY PLAN
---------------------------------------------------------------------
Seq Scan on tbl_real_net (cost=0.00..199020.00 rows=99750 width=8)
Filter: ((net_id = 4) OR (real_id = 3))
(2 rows)

未用到联合索引
如果创建的是单列索引,上述情况都能用到
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值