博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
postgresql部分索引(Partial index)
阅读量:6119 次
发布时间:2019-06-21

本文共 2601 字,大约阅读时间需要 8 分钟。

hot3.png

主要是在满足条件的部分上建立索引,特别情况下的索引效率会很高.

创建partial index

db01=# create table t_index(id int,name varchar(30));CREATE TABLEdb01=# insert into t_index select generate_series(1,1000),'name';INSERT 0 1000db01=# insert into t_index select generate_series(1001,1010),'name1';INSERT 0 10db01=# create index idx_t_index01 on t_index(name) where name != 'name';CREATE INDEXdb01=# explain select * from t_index where name != 'name';                                  QUERY PLAN                                   ------------------------------------------------------------------------------- Index Scan using idx_t_index01 on t_index  (cost=0.14..12.31 rows=10 width=9)(1 row)db01=# explain select * from t_index where name = 'name2';                                 QUERY PLAN                                  ----------------------------------------------------------------------------- Index Scan using idx_t_index01 on t_index  (cost=0.14..4.15 rows=1 width=9)   Index Cond: ((name)::text = 'name2'::text)(2 rows)db01=# explain select * from t_index where name = 'name';                        QUERY PLAN                         ----------------------------------------------------------- Seq Scan on t_index  (cost=0.00..18.62 rows=1000 width=9)   Filter: ((name)::text = 'name'::text)(2 rows)

索引列跟where条件可以不同

db01=# drop index idx_t_index01;DROP INDEXdb01=# create index idx_t_index02 on t_index(name) where id between 300 and 500;CREATE INDEXdb01=# explain select * from t_index where name = 'name1' and id = 209;                        QUERY PLAN                         ----------------------------------------------------------- Seq Scan on t_index  (cost=0.00..21.15 rows=1 width=9)   Filter: (((name)::text = 'name1'::text) AND (id = 209))(2 rows)db01=# explain select * from t_index where name = 'name1' and id = 300;                                 QUERY PLAN                                  ----------------------------------------------------------------------------- Index Scan using idx_t_index02 on t_index  (cost=0.14..8.19 rows=1 width=9)   Index Cond: ((name)::text = 'name1'::text)   Filter: (id = 300)(3 rows)

从oracle 12C开始也支持这种索引.

索引的维护

db01=# update t_index set id = 3000 where id =300;UPDATE 1db01=# explain select * from t_index where id = 3000;                       QUERY PLAN                       -------------------------------------------------------- Seq Scan on t_index  (cost=0.00..18.62 rows=1 width=9)   Filter: (id = 3000)(2 rows)

索引条目已经被移除索引,所以pg会自动维护相关索引

总结

部分索引的使用特别适用在大部分数据访问较少,只有部分数据需要经常访问的情况

比如未审核的单子,随着时间审核完成的越来越多,未审核的永远是那么些少数

转载于:https://my.oschina.net/hippora/blog/382522

你可能感兴趣的文章
充分利用HTML标签元素 – 简单的xtyle前端框架
查看>>
设计模式(十一):FACADE外观模式 -- 结构型模式
查看>>
iOS xcodebuile 自动编译打包ipa
查看>>
程序员眼中的 SQL Server-执行计划教会我如何创建索引?
查看>>
【BZOJ】1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路(floyd)
查看>>
cmake总结
查看>>
数据加密插件
查看>>
linux后台运行程序
查看>>
win7 vs2012/2013 编译boost 1.55
查看>>
IIS7如何显示详细错误信息
查看>>
ViewPager切换动画PageTransformer使用
查看>>
coco2d-x 基于视口的地图设计
查看>>
C++文件读写详解(ofstream,ifstream,fstream)
查看>>
Android打包常见错误之Export aborted because fatal lint errors were found
查看>>
Tar打包、压缩与解压缩到指定目录的方法
查看>>
新手如何学习 jQuery?
查看>>
配置spring上下文
查看>>
Python异步IO --- 轻松管理10k+并发连接
查看>>
mysql-python模块编译问题解决
查看>>
Oracle中drop user和drop user cascade的区别
查看>>