PostgreSQL 如何优化索引效率
使用 gin() 创建全文索引后,虽然有走索引,但是当结果集很大时,查询效率还是很底下,
SELECT keyword,avg_mon_search,competition,impressions,ctr,position,suggest_bid,click,update_time
FROM keyword
WHERE
update_time is not null and plainto_tsquery('driver') @@ keyword_participle
ORDER BY avg_mon_search DESC
LIMIT 500 OFFSET 0;
背景: keyword 表中有八千万行数据,建立了 gin( keyword_participle ) 索引,以及其他排序字段的 BTREE 索引
分析:当查询当个单词时,虽然有走全文索引,但是由于返回的结果集很大,有二十多万行数据,而且返回后需要再次进行排序,导致性能严重下降,
处理方法:限制全文索引返回的结果集行数,结果集变小了,也就减少了排序消耗的时间,况且全文索引分词返回的这么多数据,用户只是查看前面一部分,通过这种方式让用户完善搜索词,知道找到自己想要的结果。
SELECT
keyword,avg_mon_search,competition,impressions,ctr,position,suggest_bid,click,update_time, count(*) over() as res_count
FROM
(SELECT keyword,avg_mon_search,competition,impressions,ctr,position,suggest_bid,click,update_time
FROM keyword WHERE update_time is not null AND avg_mon_search > 0 AND plainto_tsquery('english_nostop', 'driver') @@ keyword_participle limit 20000
) AS tmp
ORDER BY avg_mon_search DESC
LIMIT 500 OFFSET 0;
如何优化索引效率
有很多方法告诉你应该如何选择索引,但是没有提索引本身的优化,实际上数据分布会影响索引的效率。
根据索引的扫描特点,对数据进行重分布,可以大幅度优化索引查询的效率。
例如bitmap index scan(按BLOCK ID顺序读取)就是PostgreSQL用于减少离散IO的手段。
1、btree数据分布优化
线性相关越好,扫描或返回多条数据的效率越高。
2、hash数据分布优化
线性相关越好,扫描或返回多条数据的效率越高。
3、gin数据分布优化
如果是普通类型,则线性相关越好,扫描或返回多条数据的效率越高。
如果是多值类型(如数组、全文检索、TOKENs),则元素越集中(元素聚类分析,横坐标为行号,纵坐标为元素值,数据分布越集中),效率越高。
元素集中通常不好实现,但是我们可以有集中方法来聚集数据,1. 根据元素的出现频率进行排序重组,当用户搜索高频词时,扫描的块更少,减少IO放大。2. 根据(被搜索元素的次数*命中条数)的值进行排序,按排在最前的元素进行聚集,逐级聚集。
(以上方法可能比较烧脑,下次发一篇文档专门讲GIN的数据重组优化)
《索引扫描优化之 - GIN数据重组优化(按元素聚合) 想象在玩多阶魔方》
4、gist数据分布优化
如果是普通类型,则线性相关越好,扫描或返回多条数据的效率越高。
如果是空间类型,则元素越集中(例如数据按geohash连续分布),效率越高。
5、brin数据分布优化
线性相关越好,扫描或返回多条数据的效率越高。
6、多列复合索引数据分布优化
对于多列符合索引,则看索引的类型,要求与前面一样。
增加一个,多个列的线性相关性越好,性能越好。
多列线性相关性计算方法如下
《PostgreSQL 计算 任意类型 字段之间的线性相关性》
数据分布还有一个好处,对于列存储,可以大幅提升压缩比
《一个简单算法可以帮助物联网,金融 用户 节约98%的数据存储成本 (PostgreSQL,Greenplum帮你做到)》
PostgreSQL 如何优化索引效率的更多相关文章
- PostgreSQL中的索引(一)
引言 这一系列文章主要关注PostgreSQL中的索引. 可以从不同的角度考虑任何主题.我们将讨论那些使用DMBS的应用开发人员感兴趣的事项:有哪些可用的索引:为什么会有这么多不同的索引:以及如何使用 ...
- SQL SERVER全面优化-------索引有多重要?
想了好久索引的重要性应该怎么写?讲原理结构?我估计大部分人不愿意看,也不愿意花那么多时间仔细研究.光写应用?感觉不明白原理一样不会用.举例说明?情况太多也写不全....到底该怎么写呢? 随便写吧,想到 ...
- Solrj和Solr DIH索引效率对比分析
测试软件环境: 1.16G windows7 x64 32core cpu . 2.jdk 1.7 tomcat 6.x solr 4.8 数据库软件环境: 1.16G windows7 x64 ...
- postgresql 配置文件优化
postgresql 配置文件优化 配置文件 默认的配置配置文件是保存在/etc/postgresql/VERSION/main目录下的postgresql.conf文件 如果想查看参数修改是否生效, ...
- MySql基础笔记(二)Mysql语句优化---索引
Mysql语句优化--索引 一.开始优化前的准备 一)explain语句 当MySql要执行一个查询语句的时候,它首先会对语句进行语法检查,然后生成一个QEP(Query Execution Plan ...
- mysql性能优化-慢查询分析、优化索引和配置 (慢查询日志,explain,profile)
mysql性能优化-慢查询分析.优化索引和配置 (慢查询日志,explain,profile) 一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 ...
- PLSQL_性能优化索引Index介绍(概念)
2014-06-01 BaoXinjian
- Mysql优化-索引
1. 索引的本质 MySQL官方对索引的定义为:索引是帮助MySQL高效获取数据的数据结构. 数据库查询是数据库的最主要功能之一.我们都希望查询数据的速度尽可能的快,因此 数据库系统的设计者会从查询算 ...
- postgresql 创建gin索引
1.创建gin类型的索引 postgresql 创建gin索引遇到的问题:1.ERROR: operator class "gin_trgm_ops" does not exist ...
随机推荐
- jQuery-添加新元素的方法(append()、prepend()、before()、after())
1.以 HTML 创建新元素 var txt1="<p>Text.</p>"; 2.以 jQuery 创建新元素 var txt2=$("< ...
- HDU 3351 Seinfeld 宋飞正传(水)
题意: 给出一个串,串内只有大括号,问经过几次改变可使全部括号合法?改变指的是可以将某一方向的括号变成另一方向. 思路: 利用栈的特点,若出现成对的合法括号,直接删掉,留下那些不合法的成为一串.既然不 ...
- raw_input功能
摘要: raw_input() & input() raw_input的功能是方便的从控制台读入数据. input与raw_input都是Python的内建函数,实现与用户的交互,但是功 ...
- Android(java)学习笔记94: SurfaceView使用
1. SurfaceView简介 在一般的情况下,应用程序的View都是在相同的GUI线程(UI主线程)中绘制的.这个主应用程序线程同时也用来处理所有的用户交互(例如,按钮单击或者文本输入). ...
- pycharm 安装插件 支持markdown
github项目中的README文件通常是md格式的,但是pycharm默认是不支持的,需要安装插件 进入settings中搜索plugins,然后在plugins中搜索markdown suppor ...
- C#的接口基础教程之四 访问接口
对接口成员的访问 对接口方法的调用和采用索引指示器访问的规则与类中的情况也是相同的.如果底层成员的命名与继承而来的高层成员一致,那么底层成员将覆盖同名的高层成员.但由于接口支持多继承,在多继承中,如果 ...
- eclipse中的字体大小设置和背景色设置
1.字体大小设置 在basic下选择最后一个TextFont 护眼背景色设置 添加到自定义颜色后点确定 最后一步点apply
- 问题005:如何配置JDK,Java运行环境?
方法一:我的电脑右击-->属性-->高级-->环境变量-->Path 方法二:set path是查询环境变灵, set path=路径
- Hotkeys.js 2.0.2 发布,JS 网页快捷键设置,捕获键盘输入和输入的组合键快捷键,它没有依赖
这是一个强健的 Javascript 库用于捕获键盘输入和输入的组合键,它没有依赖,压缩只有只有(~3kb),gzip:1.9k. 更新内容: 添加测试用例: 添加更多特殊键支持: 修复bug. __ ...
- JSON.parse(text[, reviver])
1. JSON.parse(text[, reviver])text 必需 有效的json字符串reviver 可选 函数 2. 举栗子1) 只有第一个参数 let objStr = '{" ...