PostgreSQL Select 索引优化

使用 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;

  

原文地址:https://www.cnblogs.com/ryanzheng/p/9604464.html

时间: 2024-10-08 03:46:44

PostgreSQL Select 索引优化的相关文章

浅谈PostgreSQL的索引

1. 索引的特性 1.1 加快条件的检索的特性 当表数据量越来越大时查询速度会下降,在表的条件字段上使用索引,快速定位到可能满足条件的记录,不需要遍历所有记录. create table t(id int, info text); insert into t select generate_series(1,10000),'lottu'||generate_series(1,10000); create table t1 as select * from t; create table t2 a

(转)浅谈PostgreSQL的索引

1. 索引的特性 1.1 加快条件的检索的特性 当表数据量越来越大时查询速度会下降,在表的条件字段上使用索引,快速定位到可能满足条件的记录,不需要遍历所有记录. create table t(id int, info text); insert into t select generate_series(1,10000),'lottu'||generate_series(1,10000); create table t1 as select * from t; create table t2 a

MySQL 索引优化原则

一.索引优化原则 1.最左前缀匹配原则,联合索引,mysql会从做向右匹配直到遇到范围查询(>.<.between.like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整. 2.=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优

MySQL如何利用索引优化ORDER BY排序语句

MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度. MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作. 通过索引优化来实现MySQL的ORDER BY语句优化: 1.ORDER BY的索引优化.如果一个SQL语句形如:SELECT [column1],[column2],…. FROM [TABLE] ORDER BY [sort];在[sort]这个栏位上建立索引就可以实现利用索引进行order by

索引优化策略

在表上创建索引后,如何使用到这些索引需要注意的问题.   1.索引列上不能使用表达式或函数. 例如: select * from users where upper(name)='ABC'; 改成 select * from users where  name='ABC';   2.前缀索引和索引列的选择性 索引的选择性越高索引效率越高.   3.联合索引 如何选择索引列的顺序 1.经常会被使用到的列优先 联合索引的列索引顺序是从左到右使用的. 2.选择性高的列优先 选择性很差的列不宜放到最左边

索引优化来实现MySQL的ORDER BY语句优化

MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度. MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作. 通过索引优化来实现MySQL的ORDER BY语句优化: 1.ORDER BY的索引优化.如果一个SQL语句形如: SELECT [column1],[column2],-. FROM [TABLE] ORDER BY [sort]; 在[sort]这个栏位上建立索引就可以实现利用索引进行order

索引访问方法及索引优化

要了解索引访问方法,首先要知道索引的结构. 1.表和索引的结构  页 页是sql server存储数据的基本单位,大小为8kb,可以存储表数据.索引数据.执行计划数据.分配位图.可用空间信息.页是sql server可以读写的最小I/O单位.即便是读取一行数据,它也要把整个页加载到缓存并从缓存中读取数据. 区 区是由8个连续页组成的分配单元. 堆 堆是指不含聚集索引的表,它的数据不按任何顺序进行存储. 联系一个堆中的数据的唯一结构是被称为索引分配映射(IAM)的一个位图页,当扫描对象时,SQl

SQL通用优化方案(where优化、索引优化、分页优化、事务优化、临时表优化)

SQL通用优化方案:1. 使用参数化查询:防止SQL注入,预编译SQL命令提高效率2. 去掉不必要的查询和搜索字段:其实在项目的实际应用中,很多查询条件是可有可无的,能从源头上避免的多余功能尽量砍掉,这是最简单粗暴的解决方案.3. 选择最有效率的表名顺序: 数据库的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表放在最后,如果有3个以上的表连接查询,那就需要选择那个被其他表所引用的表放在最后.

索引优化之:创建、填充和查找

在做性能优化时,经常需要创建索引,维护索引,或重建,或重组:在创建索引时,索引的数据页有时需要填充满,有时需要预留一定比例的空闲空间:在分析查询的执行计划之后,推荐创建覆盖索引(covering index),优化查询语句,使用执行计划通过Index Seek来获取少量数据等,这些都是索引优化不得不知的要点. 一,索引的重组(Reorganize)和重建(Rebuild) 在SQL Server中,索引(Index)是B-Tree(balance tree)结构,每个Page之间都有双向指针链接