gin索引优化实例1
GIN(Generalized Inverted Index, 通用倒排索引) 是一个存储对(key, posting list)集合的索引结构,其中key是一个键值,而posting list 是一组出现过key的位置。如(‘hello', '14:2 23:4')中,表示hello在14:2和23:4这两个位置出现过,在PG中这些位置实际上就是元组的tid(行号,包括数据块ID(32bit),以及item point(16 bit) )。
在表中的每一个属性,在建立索引时,都可能会被解析为多个键值,所以同一个元组的tid可能会出现在多个key的posting list中。
通过这种索引结构可以快速的查找到包含指定关键字的元组,因此GIN索引特别适用于多值类型的元素搜索,比如支持全文搜索,数组中元素的搜索,而PG的GIN索引模块最初也是为了支持全文搜索而开发的。
说到这里,你可能会觉得GIN的结构有点像b+tree,包括KEY和对应的值(posting list)。别急,请继续往下看。
- receivers跟reads字段都是数组,使用any函数来查找是个性能差的事情并且加了gin索引CBO也不会用上,使用了2295.317 ms
explain(analyze,verbose,buffers,costs,timing)
SELECT
"msgId",
"sender",
"contentType",
"content",
"expiresIn",
"timestamp",
"sessionType",
"sessionId",
"isRescission",
"isOncePush",
CAST ( "extensions" AS VARCHAR ),
NULL AS "receivers",
NULL AS "reads"
FROM
"表"
WHERE
NOT "isRescission"
AND 7189526 = ANY ( "receivers" )
AND NOT 7189526 = ANY ("reads");
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Seq Scan on public."表" (cost=0.00..140829.79 rows=79282 width=206) (actual time=191.069..2295.282 rows=1 loops=1)
Output: "msgId", sender, "contentType", content, "expiresIn", "timestamp", "sessionType", "sessionId", "isRescission", "isOncePush", (extensions)::character varying, NULL::unknown, NULL::unknown
Filter: ((NOT "表"."isRescission") AND (7189526 = ANY ("表".receivers)) AND (7189526 <> ALL ("表".reads)))
Rows Removed by Filter: 1776067
Buffers: shared hit=79270
Planning time: 0.092 ms
Execution time: 2295.317 ms
- 对表添加gin索引并改写语句达到性能优化目的
CREATE INDEX idxrgin1 on "OnceMessages_test" USING GIN ("receivers");
CREATE INDEX idxrgin2 on "OnceMessages_test" USING GIN ("reads");
改写成array函数 , @>包含, 并强制类型转换::bigint explain(analyze,verbose,buffers,costs,timing)
SELECT "msgId",
"sender",
"contentType",
"content",
"expiresIn",
"timestamp",
"sessionType",
"sessionId",
"isRescission",
"isOncePush",
CAST ( "extensions" AS VARCHAR ),
NULL AS "receivers",
NULL AS "reads" FROM "public"."表_test" where "receivers" @> ARRAY[7189526::bigint] and NOT "isRescission"
and "reads" @>ARRAY[7189526::bigint] = 'f' Bitmap Heap Scan on public."表_test" (cost=18.98..1484.00 rows=375 width=207) (actual time=0.110..0.110 rows=1 loops=1)
Output: "msgId", sender, "contentType", content, "expiresIn", "timestamp", "sessionType", "sessionId", "isRescission", "isOncePush", (extensions)::character varying, NULL::unknown, NULL::unknown
Recheck Cond: ("表_test".receivers @> '{7189526}'::bigint[])
Filter: ((NOT "表_test"."isRescission") AND (NOT ("表_test".reads @> '{7189526}'::bigint[])))
Rows Removed by Filter: 2
Heap Blocks: exact=3
Buffers: shared hit=1 read=6
I/O Timings: read=0.032
-> Bitmap Index Scan on idxrgin1 (cost=0.00..18.89 rows=385 width=0) (actual time=0.057..0.057 rows=3 loops=1)
Index Cond: ("表_test".receivers @> '{7189526}'::bigint[])
Buffers: shared hit=1 read=3
I/O Timings: read=0.016
Planning time: 0.299 ms
Execution time: 0.149 ms
- 改写之后性能达到 0.149ms , , 函数不能乱用,随便用上性能会不会更慢也不知道,要多看手册, 中国普遍程序员都是这种想用就用的模式,跟国外完全不一样的先理解再使用
否则研发思维只会越来越落后!
CREATE INDEX idxrgin1 on "OnceMessages_test" USING GIN ("receivers");
CREATE INDEX idxrgin2 on "OnceMessages_test" USING GIN ("reads");
gin索引优化实例1的更多相关文章
- MySQL索引优化实例说明
下面分别创建三张表,并分别插入1W条简单的数据用来测试,详情如下: [1] test_a 有主键但无索引 CREATE TABLE `test_a` ( `id` int(10) unsign ...
- MySql 索引优化实例
查询语句 SELECT customer_id,title,content FROM `product_comment` WHERE audit_status=1 AND product_id=199 ...
- mysql 优化实例之索引创建
mysql 优化实例之索引创建 优化前: pt-query-degist分析结果: # Query 23: 0.00 QPS, 0.00x concurrency, ID 0x78761E301CC7 ...
- 浅谈postgresql的GIN索引(通用倒排索引)
1.倒排索引原理 倒排索引来源于搜索引擎的技术,可以说是搜索引擎的基石.正是有了倒排索引技术,搜索引擎才能有效率的进行数据库查找.删除等操作.在详细说明倒排索引之前,我们说一下与之相关的正排索引并与之 ...
- MySQL优化实例
这周就要从泰笛离职了,在公司内部的wiki上,根据公司实际的项目,写了一些mysql的优化方法,供小组里的小伙伴参考下,没想到大家的热情很高,还专门搞了个ppt讲解了一下. 举了三个大家很容易犯错的地 ...
- mysql sql优化实例
mysql sql优化实例 优化前: pt-query-degist分析结果: # Query 3: 0.00 QPS, 0.00x concurrency, ID 0xDC6E62FA021C85B ...
- SQL 查询优化 索引优化
sql语句优化 性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化. 为了获得稳定的执行性能,SQL语句越简单越好.对复杂的 ...
- MySQL高级第二章——索引优化分析
一.SQL性能下降原因 1.等待时间长?执行时间长? 可能原因: 查询语句写的不行 索引失效(单值索引.复合索引) CREATE INDEX index_user_name ON user(name) ...
- MySQL高级学习笔记(四):索引优化分析
文章目录 性能下降 SQL慢 执行时间长 等待时间长 查询语句写的烂 查询数据过多 关联了太多的表,太多join 没有利用到索引 单值 复合 服务器调优及各个参数设置(缓冲.线程数等)(不重要DBA的 ...
随机推荐
- httprunner-1-linux下搭建hrun(上)
前言 相信不少小伙伴对开源项目 httprunner 都很感兴趣,我们来看下它的有哪些特点吧: 项目管理:新增项目.列表展示及相关操作,支持用例批量上传(标准化的HttpRunner json和yam ...
- openresty性能测试报告分析
一.openresty介绍 1.什么是openresty 通过揉和众多设计良好的 Nginx 模块,OpenResty 有效地把 Nginx 服务器转变为一个强大的 Web 应用服务器,基于它开发人员 ...
- Veins(车载通信仿真框架)入门教程(四)——调试及记录结果
Veins(车载通信仿真框架)入门教程(四)——调试及记录结果 在Veins入门教程(三)最后的动图中(如下图)可以看到大大小小的光圈,这个怎么实现的呢? 很简单,以收到RTS消息为例,通过finHo ...
- js控制进度条数据
<style><!-- #time{ width:500px; height: 20px; background: red; border-radius: 10px; } --> ...
- ThreadPoolExecutor源码中的适配器模式
什么是适配器模式 网上已有很多的教程,不细讲了.可以参考:五分钟了解设计模式(3)---适配器模式 在适配器模式中,一定要识别清楚,Target Adaptee Adapter分别是哪些类或接口,这样 ...
- 路由器配置深入浅出—路由器接口PPP协议封装及PAP和CHAP验证配置
知识域: 是针对点对点专线连接的接口的二层封装协议配置 PPP的PAP和CHAP验证,cpt支持,不一定要在gns3上做实验. 路由器出厂默认是hdlc封装,修改为ppp封装后,可以采用pap验证或者 ...
- weex不支持类的动态追加
做一个weex项目时遇到需要根据状态动态改变样式的功能,本来想通过判断属性追加类的方式实现,如下: :class="['long-news',{'bold-txt':noRead}]&quo ...
- SpringBoot 整合 Elasticsearch深度分页查询
es 查询共有4种查询类型 QUERY_AND_FETCH: 主节点将查询请求分发到所有的分片中,各个分片按照自己的查询规则即词频文档频率进行打分排序,然后将结果返回给主节点,主节点对所有数据进行汇总 ...
- 暑期集训20190730 取模(mod)
[题目描述] 给定一个长度为n的非负整数序列a,你需要支持以下操作: 1:给定l,r,输出a[l]+a[l+1]+…+a[r]. 2:给定l,r,x,将a[l],a[l+1],…,a[r]对x取模. ...
- 学习笔记45_log4net日志
1.配置添加一个App.config *对于网站,就使用web.config ***对于App.config和web.config的配置,在表现形式上是不一致的,使用的时候应该在网上查对于的配置设置. ...