范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

postgresql建立索引

  一、索引的类型:
  PostgreSQL提供了多  种索引类型:B-Tree、Hash、GiST和GIN,由于它们使用了不同的算法,因此每种索引类型都有其适合的查询类型,缺省时,CREATE INDEX命令将创建B-Tree索引。
  1. B-Tree:
  CREATE TABLE test1 (
  id integer,
  content varchar
  );
  CREATE INDEX test1_id_index ON test1 (id);
  B-Tree索引主要用于等于和范围查询,特别是当索引列包含操作符" <、<=、=、>=和>"作为查询条件时,PostgreSQL的查询规划器都会考虑使用B-Tree索引。在使用BETWEEN、IN、IS NULL和IS NOT NULL的查询中,PostgreSQL也可以使用B-Tree索引。然而对于基于模式匹配操作符的查询,如LIKE、ILIKE、~和 ~*,仅当模式存在一个常量,且该常量位于模式字符串的开头时,如col LIKE "foo%"或col ~ "^foo",索引才会生效,否则将会执行全表扫描,如:col LIKE "%bar"。
  2. Hash:
  CREATE INDEX name ON table USING hash (column);
  散列(Hash)索引只能处理简单的等于比较。当索引列使用等于操作符进行比较时,查询规划器会考虑使用散列索引。
  这里需要额外说明的是,PostgreSQL散列索引的性能不比B-Tree索引强,但是散列索引的尺寸和构造时间则更差。另外,由于散列索引操作目前没有记录WAL日志,因此一旦发生了数据库崩溃,我们将不得不用REINDEX重建散列索引。
  3. GiST:
  GiST索引不是一种单独的索引类型,而是一种架构,可以在该架构上实现很多不同的索引策略。从而可以使GiST索引根据不同的索引策略,而使用特定的操作符类型。
  4. GIN:
  GIN索引是反转索引,它可以处理包含多个键的值(比如数组)。与GiST类似,GIN同样支持用户定义的索引策略,从而可以使GIN索引根据不同的索引策略,而使用特定的操作符类型。作为示例,PostgreSQL的标准发布中包含了用于一维数组的GIN操作符类型,如:<@、@>、=、&&等。
  二、复合索引:
  PostgreSQL中的索引可以定义在数据表的多个字段上,如:
  CREATE TABLE test2 (
  major int,
  minor int,
  name varchar
  }
  CREATE INDEX test2_mm_idx ON test2 (major, minor);
  在当前的版本中,只有B-tree、GiST和GIN支持复合索引,其中最多可以声明32个字段。
  1. B-Tree类型的复合索引:
  在B-Tree类型的复合索引中,该索引字段的任意子集均可用于查询条件,不过,只有当复合索引中的第一个索引字段(最左边)被包含其中时,才可以获得最高效率。
  2. GiST类型的复合索引:
  在GiST类型的复合索引中,只有当第一个索引字段被包含在查询条件中时,才能决定该查询会扫描多少索引数据,而其他索引字段上的条件只是会限制索引返回的条目。假如第一个索引字段上的大多数数据都有相同的键值,那么此时应用GiST索引就会比较低效。
  3. GIN类型的复合索引:
  与B-Tree和GiST索引不同的是,GIN复合索引不会受到查询条件中使用了哪些索引字段子集的影响,无论是哪种组合,都会得到相同的效率。
  使用复合索引应该谨慎。在大多数情况下,单一字段上的索引就已经足够了,并且还节约时间和空间。除非表的使用模式非常固定,否则超过三个字段的索引几乎没什么用处。
  三、组合多个索引:
  PostgreSQL可以在查询时组合多个索引(包括同一索引的多次使用),来处理单个索引扫描不能实现的场合。与此同时,系统还可以在多个索引扫描之间组成AND和OR的条件。比如,一个类似WHERE x = 42 OR x = 47 OR x = 53 OR x = 99的查询,可以被分解成四个独立的基于x字段索引的扫描,每个扫描使用一个查询子句,之后再将这些扫描结果OR在一起并生成最终的结果。另外一个例子是,如果我们在x和y上分别存在独立的索引,那么一个类似WHERE x = 5 AND y = 6的查询,就会分别基于这两个字段的索引进行扫描,之后再将各自扫描的结果进行AND操作并生成最终的结果行。
  为了组合多个索引,系统扫描每个需要的索引,然后在内存里组织一个BITMAP,它将给出索引扫描出的数据在数据表中的物理位置。然后,再根据查询的需要,把这些位图进行AND或者OR的操作并得出最终的BITMAP。最后,检索数据表并返回数据行。表的数据行是按照物理顺序进行访问的,因为这是位图的布局,这就意味着任何原来的索引的排序都将消失。如果查询中有ORDER BY子句,那么还将会有一个额外的排序步骤。因为这个原因,以及每个额外的索引扫描都会增加额外的时间,这样规划器有时候就会选择使用简单的索引扫描,即使有多个索引可用也会如此。
  四、唯一索引:
  目前,只有B-Tree索引可以被声明为唯一索引。
  CREATE UNIQUE INDEX name ON table (column [, ...]);
  如果索引声明为唯一索引,那么就不允许出现多个索引值相同的行。我们认为NULL值相互间不相等。
  五、表达式索引:
  表达式索引主要用于在查询条件中存在基于某个字段的函数或表达式的结果与其他值进行比较的情况,如:
  SELECT * FROM test1 WHERE lower(col1) = "value";
  此时,如果我们仅仅是在col1字段上建立索引,那么该查询在执行时一定不会使用该索引,而是直接进行全表扫描。如果该表的数据量较大,那么执行该查询也将会需要很长时间。解决该问题的办法非常简单,在test1表上建立基于col1字段的表达式索引,如:
  CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));
  如果我们把该索引声明为UNIQUE,那么它会禁止创建那种col1数值只是大小写有区别的数据行,以及col1数值完全相同的数据行。因此,在表达式上的索引可以用于强制那些无法定义为简单唯一约束的约束。现在让我们再看一个应用表达式索引的例子。
  SELECT * FROM people WHERE (first_name || " " || last_name) = "John Smith";
  和上面的例子一样,尽管我们可能会为first_name和last_name分别创建独立索引,或者是基于这两个字段的复合索引,在执行该查询语句时,这些索引均不会被使用,该查询能够使用的索引只有我们下面创建的表达式索引。
  CREATE INDEX people_names ON people ((first_name || " " || last_name));
  CREATE INDEX命令的语法通常要求在索引表达式周围书写圆括弧,就像我们在第二个例子里显示的那样。如果表达式只是一个函数调用,那么可以省略,就像我们在第一个例子里显示的那样。
  从索引维护的角度来看,索引表达式要相对低效一些,因为在插入数据或者更新数据的时候,都必须为该行计算表达式的结果,并将该结果直接存储到索引里。然而在查询时,PostgreSQL就会把它们看做WHERE idxcol = "constant",因此搜索的速度等效于基于简单索引的查询。通常而言,我们只是应该在检索速度比插入和更新速度更重要的场景下使用表达式索引。
  六、部分索引:
  部分索引(partial index)是建立在一个表的子集上的索引,而该子集是由一个条件表达式定义的(叫做部分索引的谓词)。该索引只包含表中那些满足这个谓词的行。
  由于不是在所有的情况下都需要更新索引,因此部分索引会提高数据插入和数据更新的效率。然而又因为部分索引比普通索引要小,因此可以更好的提高确实需要索引部分的查询效率。见以下三个示例:
  1. 索引字段和谓词条件字段一致:
  CREATE INDEX access_log_client_ip_ix ON access_log(client_ip)
  WHERE NOT (client_ip > inet "192.168.100.0" AND client_ip < inet "192.168.100.255");
  下面的查询将会用到该部分索引:
  SELECT * FROM access_log WHERE url = "/index.html" AND client_ip = inet "212.78.10.32";
  下面的查询将不会用该部分索引:
  一个不能使用这个索引的查询可以是
  SELECT * FROM access_log WHERE client_ip = inet "192.168.100.23";
  2. 索引字段和谓词条件字段不一致:
  PostgreSQL支持带任意谓词的部分索引,唯一的约束是谓词的字段也要来自于同样的数据表。注意,如果你希望你的查询语句能够用到部分索引,那么就要求该查询语句的条件部分必须和部分索引的谓词完全匹配。 准确说,只有在PostgreSQL能够识别出该查询的WHERE条件在数学上涵盖了该索引的谓词时,这个部分索引才能被用于该查询。
  CREATE INDEX orders_unbilled_index ON orders(order_nr) WHERE billed is not true;
  下面的查询一定会用到该部分索引:
  SELECT * FROM orders WHERE billed is not true AND order_nr < 10000;
  那么对于如下查询呢?
  SELECT * FROM orders WHERE billed is not true AND amount > 5000.00;
  这个查询将不像上面那个查询这么高效,毕竟查询的条件语句中没有用到索引字段,然而查询条件"billed is not true"却和部分索引的谓词完全匹配,因此PostgreSQL将扫描整个索引。这样只有在索引数据相对较少的情况下,该查询才能更有效一些。
  下面的查询将不会用到部分索引。
  SELECT * FROM orders WHERE order_nr = 3501;
  3. 数据表子集的唯一性约束:
  CREATE TABLE tests (
  subject text,
  target text,
  success boolean,
  ...
  );
  CREATE UNIQUE INDEX tests_success_constraint ON tests(subject, target) WHERE success;
  该部分索引将只会对success字段值为true的数据进行唯一性约束。在实际的应用中,如果成功的数据较少,而不成功的数据较多时,该实现方法将会非常高效。
  七、检查索引的使用:
  见以下四条建议:
  1. 总是先运行ANALYZE。
  该命令将会收集表中数值分布状况的统计。在估算一个查询返回的行数时需要这个信息,而规划器则需要这个行数以便给每个可能的查询规划赋予真实的开销值。如果缺乏任何真实的统计信息,那么就会使用一些缺省数值,这样肯定是不准确的。因此,如果还没有运行ANALYZE就检查一个索引的使用状况,那将会是一次失败的检查。
  2. 使用真实的数据做实验。
  用测试数据填充数据表,那么该表的索引将只会基于测试数据来评估该如何使用索引,而不是对所有的数据都如此使用。比如从100000行中选1000行,规划器可能会考虑使用索引,那么如果从100行中选1行就很难说也会使用索引了。因为100行的数据很可能是存储在一个磁盘页面中,然而没有任何查询规划能比通过顺序访问一个磁盘页面更加高效了。与此同时,在模拟测试数据时也要注意,如果这些数据是非常相似的数据、完全随机的数据,或按照排序顺序插入的数据,都会令统计信息偏离实际数据应该具有的特征。
  3. 如果索引没有得到使用,那么在测试中强制它的使用也许会有些价值。有一些运行时参数可以关闭各种各样的查询规划。
  4. 强制使用索引用法将会导致两种可能:一是系统选择是正确的,使用索引实际上并不合适,二是查询计划的开销计算并不能反映现实情况。这样你就应该对使用和不使用索引的查询进行计时,这个时候EXPLAIN ANALYZE命令就很有用了。

常见手机品牌感受本文只谈我使用过的,或我接触很多的亲友使用过的品牌。先说一个我个人觉得很奇怪的品牌,中兴。我周围现在没有一个人用中兴,但我用的前三部智能手机都是这个牌子,我对中兴的评价也许对其不公厨房装修,厨房家电洗碗机种类有哪些?如何选购家用洗碗机呢?洗碗机是家庭装修中一个很方便的机器,厨房装修,厨房家电,它彻底解决了我们争执很久的家庭难题,那就是做完饭后谁洗碗?那么洗碗机的种类有哪些呢?如何选购家用洗碗机呢?快来和云兰装潢小编华为FreeBuds4蜜语红正式开售红色气氛组甜蜜拉满一年一度的七夕佳节已经到来,作为中国传统意义上的情人节,七夕一直都深受年轻人们的追捧。七夕佳节当天,牛郎织女在鹊桥相会,天底下的情侣也会在各种场合相会,一起度过这一美好的节日,而礼2000价位的安卓之光!这4款手机当之无愧,细数过人之处一2000段位机型选购指南根据不同的使用需求可分为以下五个梯队综合性价比高机型红米K40Pro红米K40IQOONEO5RealmeGTGTNeo机身手感好机型IQOONeo5Re这样设置,一秒亮出你的行程码最近,市场买菜商场购物医院就医主动亮明通信行程码成为当前邢台必备的防疫手段。然而,手机找码步骤太多,过程繁琐,越是心急越找不到咋办?按下图步骤设置行程码的快速打开方式。一秒亮码就是8年前的iPhone5s,还能再战几年?近期好文iPhone用户注意,你存过哪些小黄图,苹果官方都知道这可能是今年最强的拍照App曾经的安卓机皇,怎么今天沦落到这个地步这是我今年见过最离谱的贴吧在座的机友们,对手机钉子户适合新手小白做的15个暴利蓝海产品你知道很多电商大佬的一点桶金都是怎么来的吗?虽然不是卖见不到光的产品,但也绝对不是刚开始一上来就卖,居家日用,服饰箱包这些大类目,大部分都是卖些蓝海又暴利的冷门产品,虽然市场不大但聊一个笔电行业里很流行的糟糕设计虽然现在全行业都缺货缺得厉害,但客观地说,各家新品多少都有进步。然而让我很不爽的是,在笔记本电脑的键盘设计方面,很多品牌键盘布局都愈发迷惑,特别是电源键的位置惠普在这方面最有才,他出差衣服褶皱,随时随地熨烫,科西手持挂烫机P1评测最近人类高质量男性的梗很多。有人说是想红的恶意炒作,也有人说是油到可以炒菜了。但是话说回来,也不得不承认这位人类高质量男性的装扮是真的很精致,衣着的每一个细节都拿捏得很到位。一般来社区团购小程序怎么选择?付费和免费小程序哪个好?有什么区别?在社区团购模式普及之后,市场上的系统开发商也层出不穷,价格从高到低不等。这也是社区团购企业在选择系统时头疼的问题,尤其是很多企业并不是第一次接触社区团购模式的时候。我想在系统上投入越薄越好?为什么米家要把电磁炉打造得那么薄?这两年手机的厚度越来越薄,颜值越来越高。而米家刚刚也发布了超薄电磁炉,23mm的机身厚度堪称电磁炉市场最薄,让人没想到连小家电居然也在追赶手机行业的轻薄潮流。那么,对于电磁炉这类小
国产7英寸PC掌机OnexPlayermini即将发布,轻至589克OnexPlayer壹号掌机是一个主做搭载了Windows系统的PC游戏掌机的国产品牌,从今年5月开始依次发布了OnexPlayerOnexPlayer1S英特尔处理器版以及AMD日本通信公司仍在推翻盖4G手机有较广的市场需求据媒体报道,日本国内各大通信运营商仍在推出支持4G网络的翻盖手机,公司称目前仍有许多客户希望继续使用翻盖手机!据日本电信运营商KDDI称,翻盖手机在日本仍有比较广的市场,尤其是喜欢华为与小米的投资帝国近两年来,国产半导体加速发展,越来越多细分领域多半导体企业进入大众视野,包括阿里OPPO华为小米等各个龙头都在半导体领域开始布局。今年,华为旗下的哈勃已经投资了超过35家半导体企业中国快递专用新能源物流车挺进欧洲市场2021年12月16日,矩阵数据科技豪驰智能汽车与德国WeberGreenTechAG(简称WEBER公司)所代表的WEBER家族双方举行以橙仕相伴畅运欧洲为主题的战略合作签约仪式饿了么全面升级骑士保障体系专家评平台举措是劳动过程人性化的进步封面新闻记者张越熙伴随着人力资源和社会保障部国家发展改革委等八部门联合发布关于维护新就业形态劳动者劳动保障权益的指导意见,饿了么美团等平台纷纷公布了骑手权益保障制度完善的阶段性成果通证经济是最大的骗局终于可以理直气壮的说出这句话了通证经济是个骗局。面对大多数的区块链项目走不出困境,数字币在归零边缘徘徊的状况,所谓的通证经济已经露出了自己的原形。为什么大多数的数字币免不了归零,为在linux系统下使用内存技术,检测堆越界错误越界监测技术1一般使用c或cpp编程时,堆栈越界访问(readwrite)往往会引起很多意想不到的错误,比如延后的进程崩溃等。因此,如果有一种方法,可以让越界访问立即触发系统错误(大力推进数字产业化和产业数字化作者孙新波(东北大学工商管理学院副院长教授,沈阳市企业管理哲学与数字生态研究中心主任)张明超(东北大学数字辽宁发展战略研究院研究员)随着数字技术的蓬勃发展及其在产业经济领域的渗透扩科学家发现巨型黑洞之中有四个空洞天文学家在一个星系团的中心发现了四个巨大的空洞。这种不同寻常的特征到底是如何形成的?科学家正在努力找到答案。星系团是宇宙中由引力聚集在一起的最大结构。它们是数百甚至数千个独立星系大2021年最值得入手的3款手机,有你的吗?2021即将过去,回顾这一年,几大厂家发布的无数款型号手机,其中不乏高配低价,低价高配,那2021年最值得入手的3款手机,快来看看有你的吗?第一款红米K40自从小米把性价比这根棒交美政府突然发难商汤科技坚持尽快上市本报记者曲忠芳李正豪北京报道商汤科技的上市之路一波三折。12月16日,一则商汤科技将于12月20日重启赴港IPO计划的消息甚嚣尘上,对此,商汤科技方面回应称对此不予置评。在此前的美