上万条数据, 短时间内连续查询几千次, 是数据库查, 还是内存查更好一点?

2024-04-14 15:42:17 +08:00
 bthulu

客户库存有一万多, 要将这一万多库存按客户要求分散到几百个工位上, 需要针对库存的多个属性进行多次查询, 循环里套循环, 能查上千次甚至更多.

这种情况下, 我是直接数据库查, 还是将数据一次全拉到内存, 在内存里查更好?

数据库查可以走索引, 内存里可就没索引查一次就是全量遍历一次了. 如果有内存里支持索引的列表就好了. 语言是.net8.

别说什么优化查询方案一次查询搞定的了, 这不可能. 现实业务就是各个工位之间关系也是错综复杂, 只能这样查了.

10457 次点击
所在节点    数据库
76 条回复
wxf666
2024-04-14 15:50:15 +08:00
全读出来,存到 HashMap 里,不也相当于有索引了吗?

ktqFDx9m2Bvfq3y4
2024-04-14 15:56:04 +08:00
就这么点儿数据,内存里面就算没索引也是比数据库快很多。
bthulu
2024-04-14 15:57:55 +08:00
@wxf666 这个你咋存? 比如某个属性 width, 范围从 800, 850, 900, 一直到 3000. width=800 的几十条, width=850 的有几条, width=900 的又有几十条, 咋个存到 hashmap 里去?

难道按 id 作为 key 存进去? 问题是我这查询条件没有一个地方用到 id, 都是根据属性查的.
me1onsoda
2024-04-14 16:03:26 +08:00
财大气粗就用内存呗
bthulu
2024-04-14 16:04:10 +08:00
@Chad0000 问题是不走索引每次都是遍历啊.

比如 1 万条查 1 千次, 平均每次查出来 10 条数据, 对于有索引来说, 每次查询只需要定位最大值和最小值, 然后将中间的依次取出即可. 那 10 条数据走一次索引, 接触到的数据可能还不到 20 条. 一千次就是 2 万条.

如果走内存遍历, 查一次就是接触 1 万条数据. 一千次就是一千万条

也就是数据库多了一千次 IO, 但少遍历了 998 万条数据.
xmumiffy
2024-04-14 16:04:34 +08:00
存成二维数组就行,不过几万条你直接遍历也没事,内存遍历也比走网络查数据库快多了
ktqFDx9m2Bvfq3y4
2024-04-14 16:06:30 +08:00
@bthulu
数据就在你手头上,直接定义 c#数组加.where 跑跑试试呗。
LiLaoMo
2024-04-14 16:11:41 +08:00
直接查库,也不用判断索不索引的。那么丁点数据,有啥问题?
macaodoll
2024-04-14 16:17:14 +08:00
几万条,直接内存呗。这才多大点
raycool
2024-04-14 16:29:35 +08:00
几万条内存不随便放么。
wxf666
2024-04-14 17:01:10 +08:00
@bthulu #3 键是宽度值,值是(库存 ID/引用/指针/…)数组?

或者,你也模仿数据库的底层存储结构,内存里也用 B 树存储呗。。
scys
2024-04-14 17:11:47 +08:00
一万条数据?不会增加和减少?
那就全部内存,直接正则匹配即可,快到让你怀疑人生。
yufeng0681
2024-04-14 17:20:47 +08:00
描述里面的 很短时间也没说清楚,
1 、 能不能平均到 每秒多少次 sql 查询
2 、是几百个终端近乎同时发起查询?有这么高频的查询
3 、mysql 支持读写分离,有没有额外机器给你弄同步数据库用于查询

讲原始需求会好很多,方案都可能变掉,比如用 redis 先查一部分,然后再去 mysql 里面查更详细信息。(瞎举例)
bthulu
2024-04-14 18:06:07 +08:00
@yufeng0681 不需要每秒查询, 无并发. 就一个定时任务, 每 30 秒左右执行一次, 执行时间尽量控制在几百毫秒内. mysql 就普通电脑, 这是工业用的, 不存在读写分离什么的, 就一普通家用 dell PC 机上运行.
inframe
2024-04-14 18:09:51 +08:00
Mysql 内存缓冲区写大点比如实际上库 10G 、PoolSize 64G ,数据库整个就自动放进内存里了
devliu1
2024-04-14 18:42:45 +08:00
@bthulu 这个量你怎么做都行
huijiewei
2024-04-14 18:52:35 +08:00
你猜为啥 Redis 要放内存里面

只要内存没爆,就全放内存肯定不会错
wanguorui123
2024-04-14 18:55:31 +08:00
拉到本地存 SQLite 在查询 SQLite 里的数据库快很多,SQLite 充当一级缓存
ivvei
2024-04-14 19:49:02 +08:00
用数据库查啊,这么点量会很慢吗?用数据库查实现起来多简单啊。建议先按数据库写,实测不行了再想优化方案。
mark2025
2024-04-14 19:55:04 +08:00
把数据库放到内存中……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1032362

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX