V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  yjhatfdu2  ›  全部回复第 3 页 / 共 5 页
回复总数  97
1  2  3  4  5  
@249239432 我单机 pg 查了 1000w 个点,每个点附近 50 个点的数量(平均 5 个左右)也就 20 分钟
explain analyse select id,(select count(*) from geo where st_dwithin(point,g.point,50)) from geo g;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------
Seq Scan on geo g (cost=0.00..165365708334.00 rows=10000000 width=12) (actual time=1.076..1049434.731 rows=10000000 loops=1)
SubPlan 1
-> Aggregate (cost=16536.54..16536.55 rows=1 width=8) (actual time=0.105..0.105 rows=1 loops=10000000)
-> Index Scan using geo_point_idx on geo (cost=0.54..16534.04 rows=1000 width=0) (actual time=0.027..0.104 rows=14 loops=10000000)
Index Cond: (point && _st_expand(g.point, '50'::double precision))
Filter: st_dwithin(point, g.point, '50'::double precision, true)
Rows Removed by Filter: 7
Planning Time: 0.756 ms
Execution Time: 1049626.246 ms
(9 rows)

Time: 1049627.962 ms (17:29.628)
@249239432 计算次数和算法是很有关的,比如你要圈每一个点附近 50 米的所有点,你可以两次 for 循环每两个之间算一次,也可以排序/索引之后,每个点只需要用 LogN 次查询
101 天前
回复了 avadakur 创建的主题 程序员 关于数据库高并发插入的版本号问题
@shinelamla 你这样的问题也是高并发下,失败概率会很高
101 天前
回复了 avadakur 创建的主题 程序员 关于数据库高并发插入的版本号问题
如果是 pg 的话,可以考虑用 advisory_lock,读之前针对 user_id 的值加锁,更新完解锁,这样不会对表或者行加高级的锁,避免影响其他业务,也可以避免引入 redis 带来的通讯开销,应该是性能非常高的方案了
101 天前
回复了 avadakur 创建的主题 程序员 关于数据库高并发插入的版本号问题
@shinelamla 这个是个典型的不可重复读问题,在 RR 的隔离等级下,这种情况不被允许,一般来说,后一个提交的事务会失败,以避免数据不一致
101 天前
回复了 avadakur 创建的主题 程序员 关于数据库高并发插入的版本号问题
如果不是必须先获取当前 version 做业务操作然后再更新,那么直接 update version set version=version+1 where xxxx 就可以了,如果必须先获取 version 再做一些业务操作再更新,就得开事务了,然后高并发的情况还得考虑事务失败概率高的问题,可以根据你的数据库实际情况考虑使用显式锁来减少事务冲突导致的失败
101 天前
回复了 avadakur 创建的主题 程序员 关于数据库高并发插入的版本号问题
开事务
@249239432 你估计没排序吧,你这算法复杂度有点高排个序应该就是 ONLogN 了
@249239432 你这也太离谱了,我给你看看 postgis 的测试结果,笔记本上运行( m1max )。
创建一个测试表,并用使用 WGS84 坐标系,创建 1000w 条测试数据,平均分布在经度 120-130 ,纬度 60-70
postgres=# create table geo(id serial primary key,point geography);
CREATE TABLE
Time: 8.159 ms
postgres=# insert into geo(point) select st_point(120+10*random(),60+10*random(),4326) from generate_series(1,10000000);
INSERT 0 10000000
Time: 22743.621 ms (00:22.744)
postgres=# select count(*) from geo;
count
----------
10000000
(1 row)

Time: 184.563 ms
直接查找 500m 内的点
postgres=# select id,st_astext(point) from geo where point<->st_point(121,61,4326) <500;
id | st_astext
---------+----------------------------------------------
462445 | POINT(120.99758165008446 60.99813696562379)
1438617 | POINT(121.00541966217078 61.00254115685877)
6427771 | POINT(121.0057518866478 60.99946005998968)
7239910 | POINT(121.00062919717045 61.00302782747821)
480378 | POINT(121.00686930870204 60.99929456226042)
6463221 | POINT(121.00448273536959 60.99901955735362)
7497972 | POINT(121.00128087999187 61.000266168985476)
9546292 | POINT(121.00044691737057 61.00368666618427)
9594039 | POINT(121.00070061094034 60.996584053665245)
(9 rows)

Time: 897.110 ms
创建 GIST 索引后使用 ST_DWithin 函数可以使用索引加速
postgres=# select id,st_astext(point) from geo where ST_DWithin(point,st_point(121,61,4326),500) ;
id | st_astext
---------+----------------------------------------------
7497972 | POINT(121.00128087999187 61.000266168985476)
9594039 | POINT(121.00070061094034 60.996584053665245)
6463221 | POINT(121.00448273536959 60.99901955735362)
9546292 | POINT(121.00044691737057 61.00368666618427)
1438617 | POINT(121.00541966217078 61.00254115685877)
7239910 | POINT(121.00062919717045 61.00302782747821)
462445 | POINT(120.99758165008446 60.99813696562379)
480378 | POINT(121.00686930870204 60.99929456226042)
6427771 | POINT(121.0057518866478 60.99946005998968)
(9 rows)

Time: 10.359 ms
只要 10 毫秒,比你们快至少 3 亿倍

只能说废公司是贵物
这代码加这个/就是为了删你的数据吧,有毒
210 天前
回复了 kerwenard 创建的主题 iPhone 想问一下买了 15pro 的各位,续航血崩吗?
@icenine 我也是,升级 17.1.1 后基本解决了
应用程序连接,连不上后看数据库日志里面的报错,应该可以看到尝试连接的数据库名,然后改成这个就行了
@Liang 可以挂个 iCloudpd 自动同步到本地,或者网页版 iCloud 批量下载
低端的确实没法看的,辣眼睛
等离子现在不如换 QD-OLED 了,所有维度都没法比
251 天前
回复了 ddvswgg 创建的主题 iPhone 怎么压缩 iPhone 里的视频?
最简单是 mac 上 finder 里面选中需要编码的视频,右键,编码所选视频,hevc1080p
2023-01-31 11:08:29 +08:00
回复了 bmpidev2019 创建的主题 分享创造 SQLite 的文艺复兴
sqlite 不支持并发事务吧?稍微复杂点的业务都会有较大的瓶颈
2022-11-02 11:07:22 +08:00
回复了 vegforlive 创建的主题 程序员 一个关于数据库存储大量文件的问题
建议使用对象存储,比如 minio 之类的
2022-11-01 14:48:57 +08:00
回复了 yaott2020 创建的主题 Go 编程语言 请教 Golang 并发读写的问题
可以使用 atomic
2022-10-13 18:03:54 +08:00
回复了 Weixiao0725 创建的主题 程序员 现在的模糊查询大家都使用什么解决方案?
@qingshuang postgreSQL ,使用 pg_bigm 索引插件+like
1  2  3  4  5  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4144 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 29ms · UTC 05:34 · PVG 13:34 · LAX 22:34 · JFK 01:34
Developed with CodeLauncher
♥ Do have faith in what you're doing.