我已经知道通过 random() 排序是检索随机行的最糟糕的方式。我已经实现了添加 random_number 列并在检索随机行时使用该列的解决方案,然后在每次检索时更新 random_number。所有这些都用于参加返回随机代理 IP 的服务:
select proxy_ip from proxy where random_number > 0.63 limit 1
0.63 只是应用程序内部生成的随机数的一个示例。
问题是,当我使用“最差”的解决方案时:
select proxy_ip from proxy
order by random()
limit 1
调用该服务时,它似乎运行得更快。该表包含 9300 行,所以我的问题是,一个表必须包含多少行才能做出sort by random()
最坏的解决方案?
应用程序中引入了一些开销,它不能直接与数据库一起使用,而是使用数据层来运行查询,这解释了为什么更好的解决方案运行缓慢(除了它对db,不仅是 1,因为它需要更新 random_number)。
解释分析的结果:
随机排序()
Limit (cost=837.03..837.03 rows=1 width=18) (actual time=34.954..34.956 rows=1 loops=1)
-> Sort (cost=837.03..860.46 rows=9373 width=18) (actual time=34.950..34.950 rows=1 loops=1)
Sort Key: (random())
Sort Method: top-N heapsort Memory: 25kB
-> Seq Scan on proxy (cost=0.00..790.16 rows=9373 width=18) (actual time=0.013..17.951 rows=9363 loops=1)
Total runtime: 34.993 ms
使用随机列:
Limit (cost=0.00..0.23 rows=1 width=18) (actual time=0.038..0.045 rows=1 loops=1)
-> Seq Scan on proxy (cost=0.00..790.16 rows=3481 width=18) (actual time=0.029..0.029 rows=1 loops=1)
Filter: (random_number > 0.63::double precision)
Total runtime: 0.078 ms
该表有 1 个索引:
CREATE UNIQUE INDEX proxy_pkey ON proxy USING btree (id)