我帮我朋友做了个 iOS 关于定位的 app 后端, 用 NodeJS 来做的 http api, PostgreSQL 来做的数据存储。
现在用户量上来了,经纬度数据有 1000W 条了, 每分钟最多有 400 个请求。
数据库表结构:
location=# \d locations
Table "public.locations"
Column | Type | Modifiers
-----------+--------------------------+--------------------------------------------------------
id | integer | not null default nextval('locations_id_seq'::regclass)
phone | text | not null
longitude | text | not null
latitude | text | not null
date | text | not null
createdAt | timestamp with time zone |
updatedAt | timestamp with time zone |
Indexes:
"locations_pkey" PRIMARY KEY, btree (id)
"createdAt_idx" btree ("createdAt")
"phone_idx" btree (phone)
执行查询:
location=# EXPLAIN ANALYZE select * from "locations" where "phone" = '15828354000' order by "createdAt" desc limit 1;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.43..5.22 rows=1 width=74) (actual time=4848.720..4848.720 rows=1 loops=1)
-> Index Scan Backward using "createdAt_idx" on locations (cost=0.43..663383.70 rows=138739 width=74) (actual time=4848.718..4848.718 rows=1 loops=1)
Filter: (phone = '15828354000'::text)
Rows Removed by Filter: 2032111
Planning time: 0.109 ms
Execution time: 4848.746 ms
也就是说没次用户查询一次他最近的位置都会耗时 4.8s
我在想要不要用 Redis 来对这个接口做个缓存呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.