Go语言内存切片遍历与MongoDB索引查询性能对比咨询
结论
就你当前的场景,把全量数据加载到Go内存切片里遍历检索,性能比带正确索引的MongoDB查询好得多,两者速度差基本在10到100倍的水平。
算笔实账
先看数据体量:5000条数据,单条平均3.98KB,总大小也就不到20MB,全量塞到Go进程内存里连点水花都打不起来,GC额外开销几乎可以忽略。
再看两边的实际耗时:
- 内存切片遍历:Go里跑个循环遍历5000条结构体,就算每条要比对三四个过滤字段,单次遍历基本也就几十微秒,就算碰到内存缓存没命中的极端情况,撑死也不会超过1毫秒。
- MongoDB查询:哪怕Mongo就装在你本机,走环回地址查询,链路也要过网络栈、BSON编解码、数据库侧索引查找、权限校验、结果拼装这一套,单次查询少说也要1到5毫秒;要是Mongo部署在别的服务器上,耗时还会更高。
适配你场景的额外优势
你这数据更新频率最高也就每分钟1次,低的时候一天才更2次,属于非常典型的读多写少、更新不频繁的场景,内存和数据库的同步成本极低:
- 要是业务能接受最多几十秒的延迟,直接起个后台协程定时全量拉最新数据覆盖内存切片就行,20MB数据拉取也就几毫秒的事,根本不会卡业务。
- 要是要求必须读到最新数据,加个MongoDB Change Stream监听增量变更就行,数据改了毫秒级更新内存里的内容,额外开销可以忽略不计。
几个提醒
- 如果你的查询QPS很高,而且查询条件固定,根本没必要每次全量遍历:加载数据的时候顺手给常用查询字段建个内存map索引,比如常用ID查就维护个
map[查询ID]*对应结构体,查的时候直接O(1)取,耗时直接到纳秒级,比啥数据库索引都快。 - 要是你的检索逻辑特别复杂,比如要做聚合、全文搜、多维度范围组合查询,而且本身查询QPS不高,那直接查Mongo更省事儿,没必要自己在内存里写一套复杂查询逻辑。
- 要是以后数据量涨到10万条以上,再重新评估内存遍历的开销就行,现在5000条的量,真的没必要担心遍历慢。
内容的提问来源于stack exchange,提问作者rihekopo
相关产品推荐
相关产品推荐

