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