[数据库/PostgreSQL] 真的没有完美的分页方法吗?
因为性能原因,研究了很多分页 SQL 的实现:
1 、limit-offset 的耗时线性增长;
2 、keyset 不能跳转指定页;
3 、xmin 基于事务,可能有“空洞”;
4 、ctid 基于存储,不能用 where 条件过滤;
5 、pg_stats 基于统计数据,实时性差,结果不精确。
具体可参考这篇文章:
kaifeiji.cc/post/do-i-really-know-about-pagination/
我想问的是,有没有:
1 、耗时固定
2 、能跳转指定页
3 、没有“空洞”
4 、能用 where 条件过滤
5 、实时性、结果精确
的分页方法?
bitmap 索引试试?
直接看最后,这文章是搞笑的...
同楼上,拉到最后看完你文章有惊喜
开启 bitmap 扫描,直接这样?
set enable_bitmapscan =off;
没有。这不是 Pgsql 的问题。所有 SQL 数据库都存在分页到后面越来越慢问题。
海量数据查询、排序、分页。请直接上搜索引擎。
我竟然信了。。一直看到了文章最后,差点晕过去。
话说大数据分页始终是个比较麻烦的问题,不同排序和字段过滤,会导致完全不同的分页结果,连缓存都不太好做。
哈哈哈哈笑死
那我可以死心了
最终,发现问题的根源是索引损坏,导致分页时排序太慢。。。。。。。。。
答案是没有,要么上 ES 这种
根据我对很多“大厂”项目的观察,真的没有完美的分页方案。
上 ES 后又发生新的问题🐕 www.hesudu.com/t/840193
用游标呢
游标和 keyset 类似,都不能跳指定页
可以 MOVE absolute
用 mysql 也出过类似的问题,ID 主键索引不连续了,200w 数据分页一次要 2s ,在 leader 指导下直接对 ID 建索引,再分页查询立马起作用🥱
不是很懂, 为什么要给主键再建一次索引?
淘系你订单多的话, 中间也慢的, 而且经常会排序出错, 缓存上半天不变
京东我怀疑会定时腾冷热数据, 它家是真的存在不定时丢单的
这两家我估计已经接近消费领域性能和误差折中的天花板了
个人理解,MOVE 同样是要一个一个数 offset 的。有更多的线索吗?
数据库本身就不擅长做分页的
明白你的意思了,MOVE absolute 确实可以跳转到指定页,但它的实现和性能与 limit-offset 是相同的,所以耗时也是线性增长
还是有的
"但它的实现和性能与 limit-offset 是相同的,所以耗时也是线性增长"
基本上好一点的网站,翻页都是有限制的,用户也不可能无限翻下去。无限翻页就是个伪需求。
头 100 页内存缓存一下,基本上能应付 95%的情况。剩下的 5%,也不会强制要求高性能。
坚持说数据库 limit-offset 性能有问题的,不是傻就是坏。
es 也没有完美分页
懂了
搜索引擎一定条数之后不是也只能游标分页吗?
文章的最后
P.S
最终,发现问题的根源是索引损坏,导致分页时排序太慢。
修复索引后,耗时 1 秒以内——千万级的数据分页,LIMIT-OFFSET 还是 HOLD 住的。
也就是说,我前边整的活儿算是白折腾了。
有些奇葩 ORM 发出来的查询长这样:
select count(), from (
这种人现在的计算机科学还满足不了他
不信
mysql limit page 现在差不多 300 万订单数据了还是很快的啊,毫秒级响应.......
因为原有的主键索引失效了,失效原因是,那个表是开发环境的日志表,组里有同学操作过,删除了一些数据,导致索引也失效了,所以再建一次索引,leader 当时的描述是,建一个二级索引
ES 的底层是 Lucence ,LUCENCE 在我当年学习的时候,分页原理应该是直接用关键词抽出来一些倒排索引,然后用优先队列对倒排索引进行合并,上面的结果打分以后用一个大小为 K * page_size 的堆保存最好的前 K 页结果然后返回第 K 页的内容。
提醒一下,是 Lucene 不是 Lucence 。以前我也读错写错过。
分页关键点:
1 ,数据量大情况下不要 count ;
2 ,复杂查询用 es 之类;
3 ,索引排序;
4 ,组合索引;
5 ,索引类别;
6 ,explain ;
哈哈哈,被老哥鞭尸了
随便一个搜索引擎搜 '分页组件是基于 Mybatis 的,它会在你写的 SQL 脚本外面再套一层 SELECT COUNT() ROWNUM_ FROM (….) 计算总记录数,同时有另一个嵌套 SELECT FROM(…) WHERE ROWNUM > 10 AND RONNUM < 10 * 2 这种方式生成分页信息'
这种方式很高效啊
带着 filter 算总页数了
并不是总页数 只是判断有没有下一页 盲猜做无限下拉的
系统:macos 需求:支持 ssh 和 sftp,sftp 可以设置本地路径和远程路径,只需输入一遍账号密码就可以连接 ssh 和 sftp securecrt 界面有点上世…
qbittorrent-nox 运行在 OpenWrt ,是固件自带的,有 luci 页面。OpenWrt 硬件是 n3150 4C4T ,内存是 4GB 。 经常在高速下载…
找了一圈发现完全开源的成熟度不够成熟度稍微好一些的不完全开源这就是悲剧 element.io 你觉得如何?集成度很高 github.com/RocketChat/Rock…